Entwickler-Ecke

Sonstiges (Delphi) - strto... frage


hibbert - Di 07.01.03 15:43
Titel: strto... frage
hallo,
ich habe folgendes problem:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  var leftkey:word;
  begin
leftkey:='vk_'+listbox1.Items[0];
if leftkey=key then
showmessage('Pfeiltaste LINKS wurde gedrückt.');
end;
end.

und die fehlermeldung ist:
Zitat:
[Error] Unit2.pas(91): Incompatible types: 'Word' and 'String'

warum das ganze?
ich habe vor ein mini spiel zu erstellen. ein blid soll verschoben werden. dazu sollten die pfeiltasten genutzt werden. wer aber nicht mit den pfeiltasten spielen möchte, der kann die tastatur belegung ändern.
die tastaurbelegung soll in einer .ini datei gespeichert werden.
und später wieder in eine listbox (siehe oben) geladen werden.
und dann verglichen werden (steht ja alles oben). bis dahin denke ich hab ichalles gut durchdacht (oder?), doch jetzt komme ich nicht mehr weiter.
wo liegt mein fehler ?
mfg hibbert


Keldorn - Di 07.01.03 15:53

so geht das nich.

Listbox:
links
rechts
runter
oben
enter

du kannst leftkey (als private od. public in Form deklariern) einmalig beim starten oder ändern der listbox einen wert zuweisen:

Quelltext
1:
2:
3:
4:
case listbox1.itemindex of
  0: leftkey :=vk_left;
  1: leftkey := vk_right;
 ...


dann klappt der vergleich if key=leftkey then ...
mfg Frank


hibbert - Di 07.01.03 17:46

hää??
ich habs zwar hinbekommen, dass keine fehler beim erstellen sind, aber es passiert nicht. so sieht mein code jetzt aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  var leftkey:word;
begin
case listbox1.itemindex of
  0: leftkey :=vk_left;
  1: leftkey :=vk_right;
end;
if leftkey=key then
showmessage('Pfeiltaste LINKS wurde gedrückt.');
end;
end.

was hab ich diesmal falsch gemacht?

Zitat:
0: leftkey :=vk_left;
1: leftkey :=vk_right;

und das sieht mir danach aus, dass ich alle möglichkeiten durch gehen muss.
gibt es denn keine möglichkeit, einen string in ein(en) word umzuwandel? es geht doch auch mit strtoint. ich möchte das gerne mit der listbox machen, das ist mir SEHR wichtig. denn im menü, wo m,an die einstellungen speichern kann, soll die konfiguration ja in eine listbox eingetragen werden.

mfg hibbert


Keldorn - Di 07.01.03 19:23

Zitat:
ich habs zwar hinbekommen, dass keine fehler beim erstellen sind, aber es passiert nicht

was passiert nicht?

Zitat:
gibt es denn keine möglichkeit, einen string in ein(en) word umzuwandel?

bsp:
strtoint('123');
geht
Strtoint('a') geht nicht, a ist keine Zahl
Strtoint('vk_left'); geht auch ni, vk_left ist keine Zahl sondern eine Konstante.
strtoint(vk_left) hat keinen Sinn, vk_left ist ja schon eine zahl

Zitat:
und das sieht mir danach aus, dass ich alle möglichkeiten durch gehen muss.

ich hab keine andere Idee.
Sinn würde vielleicht noch folgendes ergeben: du erstellst dir eine Liste/array

Quelltext
1:
2:
3:
4:
Name(string) Tastencode(integer)
Links        vk_left
a              ord(a)
...

der Listbox weißt Du die Strings zu, beim Klick weißt du der Var Leftkey den Tastencode zu.


Quelltext
1:
2:
3:
4:
case listbox1.itemindex of
  0: leftkey :=vk_left;
  1: leftkey :=vk_right;
end;

ich denke nicht, daß es sinnvoll ist, bei jedem Onkeydown leftkey zu ermittlen, es sollte doch reichten, bei jedem Start, Laden etc. oder änderungen der Listbox leftkey zusetzen

Mfg Frank


mimi - Di 07.01.03 20:47

also wie schon Keldorn gesagt hast so geht das nicht.
meine idee währe die:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
ich finde die werte jetzt nicht.
aber hier müsen die werde der tasten drinen stehen also ich glaube 49 war für 1 oder so.
die datei sieht dann so aus:

procedure Tastenladen;
var
  keys:TStringList;
  i:Integer;
begin
  keys:=TStringList.create;
  with Keys do begin
    loadFormFile('E:\key');
    for I:=0 to count -1 do begin
      ListBox1.Items.add(strings[i]);
    end;
  end;

bei onkey down:
procedure keyTaste(key:Char);
begin
  
  ShowMessage(ord(ListBox1.items.strings[listbox1.itemindex])); 
  // ord oder chr muss halt testen
end;

verstanden ?
sonst sende ich dir einbeispiel.
das ist eigentlich ganseinfach :P :P :P
oder hast du es schon geschaft ?
du musst halt die werde in der listbox bei onKeyDown umwadenl mit ord bzw. chr mit den funktionen komme ich immer durcheinander :oops:
MFG
mimi


Keldorn - Di 07.01.03 22:07

hallo,

wenn,dann chr(...) um das Zeichen anzuzeigen

das läuft auf ungefähr dasselbe raus wie ich oben beschrieben habe.
Wenn Du allerdings nur die Tastencodes in der Liste speicherst, weiß ja keiner, was sich hinter dem Code z.B. bei 09 (tab) und den ganzen Cursortasten etc. verbirgt. Deswegen mein Vorschlag mit der Liste/array und getrennte Namen und Tastencodes.

Mfg Frank


mimi - Di 07.01.03 23:17

du musst die codes aus der liste umwandeln daüfr ist etweer chr oder ord da.
als heißt es dann

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
Code: 

ich finde die werte jetzt nicht. 
aber hier müsen die werde der tasten drinen stehen also ich glaube 49 war für 1 oder so. 
die datei sieht dann so aus: 

procedure Tastenladen; 
var 
  keys:TStringList; 
  i:Integer; 
begin 
  keys:=TStringList.create; 
  with Keys do begin 
    loadFormFile('E:\key'); 
    for I:=0 to count -1 do begin 
      ListBox1.Items.add(chr(strings[i]));  // ord oder chr
    end; 
  end; 

bei onkey down: 
procedure keyTaste(key:Char); 
begin 
  
  ShowMessage(ord(ListBox1.items.strings[listbox1.itemindex])); 
  // ord oder chr muss halt testen 
end;


hibbert - Mi 08.01.03 17:47

hallo,
danke, aber die werte kenn ich leider auch nicht ! :?
mimi, kannst du mir vielleicht doch mal ne beispiel geben, mich verwirrt das jetzt alles ein bisschen !!!
DANKE FÜR EURE HILFE !!! (jetzt schon einmal im vorraus!)

mfg hibbert


Keldorn - Mi 08.01.03 19:49

Zitat:
danke, aber die werte kenn ich leider auch nicht !

was für Werte? die Tastencodes?

für normale tasten ord() und für alle anderen gibt es virtuelle Tastencodes, die du in der Hilfe findest


Keldorn - Mi 08.01.03 20:09

ich könnt mir das so vorstellen (2Listboxen für rechts und links)

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
type
  //eigener Recordtyp
  RTasten = record
    Name: string;
    Code: word;
   end;
  TForm1 = class(TForm)
    ListBox_links: TListBox;
    ListBox_rechts: TListBox;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure ListBoxClick(Sender: TObject);
    procedure Memo1KeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
  private
    { Private-Deklarationen }
    Tasten:array[0..4] of Rtasten;   //tastenarray
    leftkey,rightkey:integer;        //tasten für links und rechts
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var I:integer;
begin
  //array aufbauen
  //irgendwie muß auch Tasten[0]:=Rtasten('Name',Code) gehen, will D3 aber nix von wissen
  Tasten[0].Name:='Crsr links';Tasten[0].Code:=vk_left;
  Tasten[1].Name:='Crsr rechts';Tasten[1].Code:=vk_right;
  Tasten[2].Name:='a';Tasten[2].Code:=ord('A'); //!! Großschreibung beachten
  Tasten[3].Name:='b';Tasten[3].Code:=ord('B');

  //listboxen aufbauen
  for i:=0 to 4 do
    begin
      ListBox_links.items.add(tasten[i].name);
      ListBox_rechts.items.add(tasten[i].name);
    end;
  //erstmal werte zuweisen
  leftkey:=0;   //index
  rightkey:=vk_reight; //code direkt
end;

procedure TForm1.ListBoxClick(Sender: TObject);
begin
  //ereignis routine beiden LB zuweisen
  //entweder du speicherst den Index, oder den tastenCode selber
  //hat Vor und nachteile
  //z.B. Vorteile  index: kannst einfacher speichern
  //               code : schneller beim abfragen
  if sender=ListBox_links then leftkey:=ListBox_links.itemindex;
  if sender=ListBox_rechts then rightkey:=Tasten[ListBox_rechts.itemindex].code;
end;

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
begin
  //ich nehm mal nen Mwemo zum probieren, wieder die 2 Möglichkeiten beachten
  if key=Tasten[leftkey].code then memo1.text:=memo1.text+'links';
  if key=rightkey then memo1.text:=memo1.text+'rechts';
end;


Mfg Frank


hibbert - Mi 08.01.03 22:18

OK, danke für eure hilfe, aber das wird mir zu kompliziert, ich schnalle jetzt langsam nichts mehr, und es häufen sich die fehler beim starten des programmes, ich hätte mir das einfacher vorgestellt. naja, jeder kann sich mal täuschen :oops:
aber danke, ich versuchs mal anders, oder lasse dann diese konfiguration weg.
mfg hibbert


Keldorn - Do 09.01.03 09:26

was ist daran so kompiziert? letzendlich hast nur 2 Zeilen (ListboxClick) und (Keydown) - die Listboxen mußt du so oder so aufbauen.

Zitat:

und es häufen sich die fehler beim starten des programmes,

welche Fehler?, bei mir kamen keine

Mfg Frank


hibbert - Do 09.01.03 13:29

z.b:
listbox_links besteht schon,...
außerdem, wozu benötige ich das memo?
aber ich habe einen anderen weg gefunden:
in der option wird per dropdown der taste ausgewählt, und der itemindex in der datei config.ini abgespeichert.
dort wo die tasten benötigt werden, wird die datei config.ini in eine listbox geladen. und der code sieht dann so aus:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
// Alle tasten links
if key=vk_left then
if listbox1.Items[0]='0'then
auto.Left:=auto.Left-3;
if key=vk_NUMPAD4 then
if listbox1.Items[0]='13'then
auto.Left:=auto.Left-3;
if key=ord('A') then
if listbox1.Items[0]='5'then
auto.Left:=auto.Left-3;
if key=ord('L') then
if listbox1.Items[0]='9'then
auto.Left:=auto.Left-3;
end;

voila, und es funktioniert :wink:
damit ist das thema für mich abgeschlossen, fast...
wenn es noch einfacher geht, oder es eine weitere möglichkeit gibt, dann sagt es mir bitte, danke.

mfg hibbert


Keldorn - Do 09.01.03 14:10

memo: das memo brauchst du nicht, hatte rein geschrieben, das das nur zum probieren ist.

was ist an meinem Beispiel so schwer zu verstehen?
das Tastenarray auf alle anderen tasten zu erweitern sollte keine Sache von 10 min sein.

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// Alle tasten links 
if key=vk_left then 
if listbox1.Items[0]='0'then 
auto.Left:=auto.Left-3; 
if key=vk_NUMPAD4 then 
if listbox1.Items[0]='13'then 
auto.Left:=auto.Left-3; 
...

daß mußt du mir jetzt mal erklären


hibbert - Do 09.01.03 14:54

gut, nach langem hin und her konnte ich miczh nocheinmal selbst dazzu überreden, die sache doch noch nicht zu begraben.
und nach einigen fehlern, hat es dann auch endlich geklappt, dass ich eine form mit 2 listboxen habe. (listbox_links, listbox_rechts)

und wie lautet dann der code um ein object zu bewegen ?

wenn das dann jetzt noch klappen würde, dann könnten wir ja endlich dieses thema beenden.

mfg hibbert


Keldorn - Do 09.01.03 15:02

je nachdem, welche Variante du nimmst im Keydownergeignis:

Quelltext
1:
2:
3:
4:
  //leftkey enthält den Index im Array
  if key=Tasten[leftkey].code then auto.Left:=auto.Left-3; 
   //oder rightkey enthält den Tastencode
  if key=rightkey then auto.Left:=auto.Left+3;

Mfg Frank