Autor Beitrag
hibbert
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: Di 07.01.03 15:43 
hallo,
ich habe folgendes problem:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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
ausblenden 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Di 07.01.03 20:47 
also wie schon Keldorn gesagt hast so geht das nicht.
meine idee währe die:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mi 08.01.03 20:09 
ich könnt mir das so vorstellen (2Listboxen für rechts und links)
ausblenden volle Höhe 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

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
hibbert Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: 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

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: 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:
ausblenden 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

_________________
I kunnen väl svara endast ja eller nej
Om i viljen eller nej
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1007

WinServer2003, Win XP, Linux
D6 Pers, D05
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Do 09.01.03 15:02 
je nachdem, welche Variante du nimmst im Keydownergeignis:
ausblenden 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)