| Autor |
Beitrag |
hibbert
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: Di 07.01.03 15:43
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
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: 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
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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
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
MFG
mimi
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: 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 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: 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
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mi 08.01.03 20:09
ich könnt mir das so vorstellen (2Listboxen für rechts und links)
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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: 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
aber danke, ich versuchs mal anders, oder lasse dann diese konfiguration weg.
mfg hibbert
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: 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
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
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
hibbert 
      
Beiträge: 1007
WinServer2003, Win XP, Linux
D6 Pers, D05
|
Verfasst: 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
_________________ I kunnen väl svara endast ja eller nej
Om i viljen eller nej
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|