Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Warum funktioniert ein Code einmal und dann wieder nicht? (https://www.delphipraxis.net/142895-warum-funktioniert-ein-code-einmal-und-dann-wieder-nicht.html)

Mr.XYZ 5. Nov 2009 16:22


Warum funktioniert ein Code einmal und dann wieder nicht?
 
Hi,
ich habe in meinem neuen Delphi Programm folgende Zeile verwendet:
Delphi-Quellcode:
taste:=IntToStr(key);
Aber jetzt wollte ich sie wieder verwende, und es geht nicht mehr. :x
Delphi-Quellcode:
procedure TForm2.FormKeyPress(Sender: TObject; var Key: Char);
var
pres : string;
begin
pres:= IntToStr(key);
 if (pres = '17') then
 begin
 self.Height:=326;
 Bevel1.Visible:=true;
 Edit2.Visible:=true;
 end;
end;
Wieso, und was muss ich ändern?

Fehler: Inkompatible Typen

mkinzler 5. Nov 2009 16:27

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Char ist kein Integer

Mr.XYZ 5. Nov 2009 16:28

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Warum geht es dann beim ersten Mahl?

Cyberbob 5. Nov 2009 16:30

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Versuch mal das:

Delphi-Quellcode:
procedure TForm2.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Ord(Key) = 17 then
  begin
    self.Height:=326;
    Bevel1.Visible:=true;
    Edit2.Visible:=true;
  end;
end;

p80286 5. Nov 2009 16:31

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Weil da Key ein Integer/Byte/Word... war?

Gruß
K-H

alleinherrscher 5. Nov 2009 16:32

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Viel eleganter ist es, wenn du die Funktion Hier im Forum suchenord verwendest:

Delphi-Quellcode:

if ord(key)=17 then [do something]
[edit: [OT]Oh man, warum kommt heute keine Warnung, wenn neue Beitrage gepostet worden sind, bevor man den eigenen Beitrag abschickt?[/OT]]

Sir Rufo 5. Nov 2009 16:33

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Zitat:

Zitat von Mr.XYZ
Warum geht es dann beim ersten Mahl?

Da war der Compi noch hungrig :mrgreen:

Ich vermute mal, du hast diese Codezeile im Event OnKeyDown oder OnKeyUp benutzt, und da ist Key vom Typ word!

cu

Oliver

@himitsu: erster :P

himitsu 5. Nov 2009 16:34

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Delphi-Quellcode:
if Key = #17 then
Zitat:

Zitat von Mr.XYZ
Warum geht es dann beim ersten Mahl?

kann es dein, daß du da OnKeyDown oder OnKeyUp verwendet hattest?
Wenn ja, dann schau dir mal die Definitionen genau an.

Cyberbob 5. Nov 2009 16:35

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Es gibt OnKeyPress und OnKeyDown. Beim einen wird das Zeichen als Parameter übergeben, beim anderen wird der Tastencode als Parameter übergeben!

Mr.XYZ 5. Nov 2009 16:40

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
danke geht jetzt, aber ich hätte da noch eine frage.
also wie man im Quellcod sieht,
Delphi-Quellcode:
procedure TForm2.FormKeyPress(Sender: TObject; var Key: Char);
var
pres : string;
begin
if Ord(Key) = 17 then
  begin
    self.Height:=326;
    Bevel1.Visible:=true;
    Edit2.Visible:=true;
  end;
end;
wird immer wen man 17 also Strg. drückt ein Menü sichtbar, aber sobald ich das Programm starte ist der Fokus auf einem Edit, und ich bekomme ihn nicht herunter. demzufolge geht das ganze nicht , und ich weiß nicht wich dieses Problem lösen kann.
wie bekomme ich das hin?

alleinherrscher 5. Nov 2009 16:44

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Dann solltest du dem Formular den Fokus zurückgeben (Form1.SetFocus oder sowas)

Ralf Kaiser 5. Nov 2009 16:45

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Setze "Form.KeyPreview" auf true. So bekommt das Formular die Tastendrücke "zu sehen" auch wenn ein Editfeld gerade den Focus hat!

DeddyH 5. Nov 2009 16:46

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Hast Du mal versucht, ActiveControl auf nil zu setzen?

Mr.XYZ 5. Nov 2009 17:00

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
alle befehle helfen nur halbwegs, da
Delphi-Quellcode:
ActiveControl
und
Delphi-Quellcode:
Form.KeyPreview
nicht richtig funktionieren(Form und edit haben den Fokus beide) und
Delphi-Quellcode:
setFocus
funktioniert überhaupt nicht.
Das blöde ist sobald das edit mitkriegt, das Strg. gedrückt wurde löst es einen Fehler aus.(liegt an meinem Programm, is aber nicht änderbar)

DeddyH 5. Nov 2009 17:14

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Zitat:

Zitat von Mr.XYZ
Form und edit haben den Fokus beide

Das halte ich für ein Gerücht.
Zitat:

Zitat von Mr.XYZ
liegt an meinem Programm, is aber nicht änderbar

Das ebenso.

BTW: "Funktioniert nicht" ist eine äußerst detaillierte Fehlerbeschreibung :evil:

Mr.XYZ 5. Nov 2009 17:23

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
He!!
mein Programm analysiert jede taste die gedrückt wird, und bei Strg. hat es sich immer überarbeitet. Konten das Problem aber jetzt lösen! wolte nur noch mal sagen, wen ich dem Form mit
Delphi-Quellcode:
Form.KeyPreview
den Fokus zuweise(also beim Start) dann heißt es immer "einem Unsichtbaren oder inaktiven Fenster kann kein Fokus zugewiesen werden", habe aber jetzt
Delphi-Quellcode:
Form.KeyPreview
verwendet

alleinherrscher 5. Nov 2009 17:27

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Wo hast du denn das KeyPreview stehen? Lass mich mal raten: Ich tippe auf FormCreate ;-)

Mr.XYZ 5. Nov 2009 17:32

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
jup!! wieso den :?:

alleinherrscher 5. Nov 2009 17:59

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Weil dort dein Formular evtl noch gar nicht angezeigt wird. Versuchs mal mit OnShow ;)

Mr.XYZ 5. Nov 2009 18:13

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
hab ich auch schon!

Ralf Kaiser 5. Nov 2009 18:37

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Zitat:

Zitat von Mr.XYZ
wolte nur noch mal sagen, wen ich dem Form mit
Delphi-Quellcode:
Form.KeyPreview
den Fokus zuweise(also beim Start) dann heißt es immer "einem Unsichtbaren oder inaktiven Fenster kann kein Fokus zugewiesen werden"

Ähhmm, "mit KeyPreview den Focus zuweisen"???? :gruebel: Wie soll das denn gehen?

"KeyPreview" ist eine Eigenschaft deines Formulars vom Typ "boolean". Dieser Eigenschaft musst du den Wert "true" zuweisen. Das geht auch im Objektinspector.

Also, angenommen dein Formular heisst "DasFormular", dann kannst du, z.B. in OnCreate, schreiben:

Delphi-Quellcode:
KeyPreview := true; // entspricht DasFormular.KeyPreview := true;
Alternativ dazu kannst du die Eigenschft natürlich im OI zuweisen.

Wenn KeyPreview den Wert "true" hat wirkt sich da so aus, dass das Formular vor allen anderen Komponenten auf dem Formular die Tasten über die Events "OnKey..." zu sehen bekommt. Ist der Wert false so gehen die Tasten nur an die Komponente die gerade den Focus hat.

siehe auch: Delphi-Referenz durchsuchenKeyPreview

Matze 5. Nov 2009 18:38

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Setze es doch einfach im OI (Objektinspektor), dann hast du deine Ruhe.

Edit: Da war wohl einer schneller.

Mr.XYZ 5. Nov 2009 18:52

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Entschuldigung sollte heißen:
Zitat:

He!!
mein Programm analysiert jede taste die gedrückt wird, und bei Strg. hat es sich immer überarbeitet. Konten das Problem aber jetzt lösen! wolte nur noch mal sagen, wen ich dem Form mit
Delphi-Quellcode:
Form.KeyPreview
den Fokus zuweise(also beim Start) dann heißt es immer "einem Unsichtbaren oder inaktiven Fenster kann kein Fokus zugewiesen werden", habe aber jetzt
Delphi-Quellcode:
Form.ActiveControl
verwendet.
und nicht:

Zitat:

He!!
mein Programm analysiert jede taste die gedrückt wird, und bei Strg. hat es sich immer überarbeitet. Konten das Problem aber jetzt lösen! wolte nur noch mal sagen, wen ich dem Form mit
Delphi-Quellcode:
Form.KeyPreview
den Fokus zuweise(also beim Start) dann heißt es immer "einem Unsichtbaren oder inaktiven Fenster kann kein Fokus zugewiesen werden", habe aber jetzt
Delphi-Quellcode:
Form.KeyPreview
verwendet

Ralf Kaiser 5. Nov 2009 18:59

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Zitat:

Zitat von Mr.XYZ
mein Programm analysiert jede taste die gedrückt wird, und bei Strg. hat es sich immer überarbeitet.

Also, das will ich jet aber mal wissen:

Wie äussert es sich wenn ein Programm sich "überarbeitet"?? :gruebel:

mkinzler 5. Nov 2009 19:07

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Zitat:

Wie äussert es sich wenn ein Programm sich "überarbeitet"?? Grübelnd...
Es geht zum Arzt und lässt sich das Burnout-Syndrom attestieren :stupid:

Mr.XYZ 5. Nov 2009 19:14

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Zitat:

Zitat von Alfi001
Wie äussert es sich wenn ein Programm sich "überarbeitet"?? :gruebel:

Weiß ich doch nicht, ich meinte halt das es so was wie eine Endlosschleife gab.(oder weiß ich was..)

Ralf Kaiser 5. Nov 2009 19:25

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Hattest du "KeyPreview" auf true gesetzt?

Zeig doch nochmal den kompletten Code der ausgeführt wird wenn die Taste gedrückt wird. Ich vermute nämlich, dass dort die Löschung des Tastendruckes mit "Key := 0" bzw. "Key := #0" (je nachdem in welchem Eventhandler) fehlt!

Ralf Kaiser 5. Nov 2009 19:27

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Zitat:

Zitat von mkinzler
Zitat:

Wie äussert es sich wenn ein Programm sich "überarbeitet"?? Grübelnd...
Es geht zum Arzt und lässt sich das Burnout-Syndrom attestieren :stupid:

Oder es äussert sich so:

Delphi-Quellcode:
ShowMessage('Ach lass mich in Ruhe. Ich hatte heute einen schweren Tag');
Application.Terminate;
SCNR...

p80286 6. Nov 2009 09:08

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
Zitat:

He!!
mein Programm analysiert jede taste die gedrückt wird, und bei Strg. hat es sich immer überarbeitet.....
Soll wohl eher heißen "... mein Programm soll jede Taste, die gedrückt wird, analysieren....."

Zeig doch mal den Quellcode!
Da stimmt doch hinten und vorne was nicht.

Zitat:

Weiß ich doch nicht, ich meinte halt das es so was wie eine Endlosschleife gab.(oder weiß ich was..)
Wir wissen nicht was Ihr Arzt empfielt, wir empfehlen die Benutzung des Debuggers.

Gruß
K-H

Mr.XYZ 6. Nov 2009 11:17

Re: Warum funktioniert ein Code einmal und dann wieder nicht
 
okay hier ist der Quellcode kannst ihn ja gleich korrigieren wen du willst.[ist aber noch nicht vertig)
Delphi-Quellcode:
unit Unit2;

interface

uses
  mmsystem, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Buttons;

type

  Tnumer = record
           zahl : string;
           end;
  Toperation = record
               operant : string;
               end;
  Trechnung = record
              numer : array[0..100] of Tnumer;
              operation : array[0..100] of Toperation;
              end;

  TForm2 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Label2: TLabel;
    Bevel1: TBevel;
    Edit2: TEdit;
    Label3: TLabel;
    procedure Edit2Change(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Button1Click(Sender: TObject);
    procedure Edit2Enter(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  chint : string;
  vertig : string;
  taste : string;
  pres_un : integer;
  sactiv : string;
  klammer1 : Char;
  i : integer;
  y : integer;
  ch: integer;
  x : integer;

  baum : array[0..100] of integer;
  activ : integer;
  first : boolean;
  input : string;
  save : string;
  vare : Array [0..100] of string;

  Form2: TForm2;


implementation


{$R *.dfm}
procedure TForm2.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 if (key = VK_DELETE) then
 begin
 Edit1.Text:='clear';
 end;
 if (key = VK_SHIFT) or(key = VK_CONTROL) or (key = VK_DELETE) or (pos('key','q,w,e,r,t,z,u,i,o,p,ü,a,s,d,f,g,h,j,k,l,ö,ä,y,x,c,v,b,n,m')>0) or (key = VK_TAB) or (key = VK_CLEAR) or (key = VK_MENU) then
 begin
 pres_un:=pres_un+1;
 Edit1.Text:=save;
 end else
 begin
 if (first = false) then
  begin
   save:= Edit1.Text;
    first:=true;
   ch:= length(save);

   if (save[ch] = chr(40) ) then
   begin
    baum[y]:=x;
    ch:= length(baum);
    Label2.Caption:= IntToStr(baum[0]);
    first:=true;
    vare[activ]:=vare[activ]+'V'+IntToStr(baum[y]);
    activ:=1;
    for i:= 1 to ch do
      begin
       Label2.Caption:= Label2.Caption+IntToStr(baum[i]);
      end;
   end;
  input:=edit1.Text;
  ch:=length(input);
  klammer1:= chr(41);
  Label2.Caption:=klammer1+' = '+input[ch];
  if ( input[ch] = klammer1 ) then
  begin
   baum[y]:=0;
   baum[0]:=0;
   y:=0;
   baum[y]:=0;
   first:= false;
   application.MessageBox('Felerhafte eingabe!!','Error!!',MB_OK);
   Edit1.text:='';
  end;
  ch:=length(input);
  taste:=IntToStr(key);
  if (taste<>'56') and (taste<>'57') then begin
    first:=true;
    chint:=input[ch];
    if (chint = '+') or (input[ch] = '-') or (input[ch] = '*') then
    begin
    application.MessageBox('Felerhafte eingabe!!','Error!!',MB_OK);
    Edit1.text:='';
    end;
    if(chint = 'k') then
    begin
    Edit1.Text:='';
    first:= false;
    end;
    ch:=length(input);
    input:=edit1.Text;
    vare[activ]:=vare[activ]+input[ch];
    end;

  end else
   begin
   input:=edit1.Text;
   ch:= length(input);

   if (input[ch] = chr(40) ) then
   begin
   //Label2.Caption:='+'+input[ch];
   x:=x+1;
   y:=y+1;
   baum[y]:=x;
   ch:= length(baum);
   vare[activ]:=vare[activ]+'V'+IntToStr(baum[y]);
   activ:= x;
   Label2.Caption:= IntToStr(baum[0]);
    for i:=1 to ch do
     begin
      Label2.Caption:= Label2.Caption+IntToStr(baum[i]);
     end;
   end;
   ch:= length(input);
   if(input[ch] = chr(41) ) then
   begin
   y:= y-1;
   activ:= baum[y];
   if ( y<=0) then
   begin
   application.MessageBox('Felerhafte eingabe!!','Error!!',MB_OK);
   y:= y+1;
    ch:= length(input);
    ch:= ch-1;
    Edit1.text:=copy(input,1,ch);
   end else
   begin
   baum[y]:=0;
   ch:= length(baum);
   Label2.Caption:= IntToStr(baum[0]);
     for i:=1 to ch do
      begin
       Label2.Caption:= Label2.Caption+IntToStr(baum[i]);
      end;
      end;
   end;
    ch:= length(input);
    taste:=IntToStr(key);
  if (taste<>'56') and (taste<>'57') then begin
    first:=true;
    chint:=input[ch];
   // if (chint = '+') or (input[ch] = '-') or (input[ch] = '*') then
//    begin
//    application.MessageBox('Felerhafte eingabe!!','Error!!',MB_OK);
//    Edit1.text:='';
//    end;
    if(chint = 'k') then
    begin
    Edit1.Text:='';
    first:= false;
    end;
    ch:=length(input);
    input:=edit1.Text;
    vare[activ]:=vare[activ]+input[ch];
    end;
   end;
end;
vertig:=vare[0]+' '+vare[1]+' '+vare[2]+' '+vare[3]+' '+vare[4];
//Label2.Caption:=vertig+'; Ac='+IntToStr(activ);
Label2.Caption:=taste+' : '+'56 or 57'+' = '+BoolToStr((taste<>'56') and (taste<>'57'));
save:=Edit1.Text;
end;
procedure TForm2.FormShow(Sender: TObject);
begin
x:=0;
y:=1;
Form2.KeyPreview:=true;
end;

procedure TForm2.Edit2Enter(Sender: TObject);
var
prüf : string;
begin
prüf:=Edit2.Text;
if (prüf = 'control') then
begin
Label2.Visible:=true;
end;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
ip : integer;
rechnung : array[0..100] of Trechnung;
num : integer;
y : integer;
i : integer;
j : integer;
t : integer;
eingelesen : string;
begin
 
for i:=0 to 100 do
 begin
 j:=0;
  num:= length(vare[0]);
  while j<num do
  begin
  j:=j+1;
 // eingelesen:=vare[0];
//  Label3.Caption:=eingelesen+' : '+IntToStr(j);
  eingelesen:=copy(vare[0],1,j);
  //Label3.Caption:=eingelesen;
  ip:= length(eingelesen);
   if (eingelesen[ip] = '+') and (eingelesen[ip]='-') and (eingelesen[ip]='/') and (eingelesen[ip]='*') then
   begin
   eingelesen:=copy(vare[0],1,j-1);
   rechnung[0].numer[0].zahl:=eingelesen;
   j:=num+1;
   end;
   if (eingelesen[ip] = 'V') then
   begin
   j:=j+1;
   end;
  end;
 end;
Label3.Caption:=eingelesen+' : '+rechnung[0].numer[0].zahl;
end;

procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Ord(Key) = 17 then
  begin
    self.Height:=326;
    Bevel1.Visible:=true;
    Edit2.Visible:=true;
    Form2.ActiveControl:=Edit2;
  end;
end;

procedure TForm2.Edit2Change(Sender: TObject);
var
prüf : string;
begin
prüf:=Edit2.Text;
if (prüf = 'control') then
begin
Label2.Visible:=true;
Label3.Visible:=true;
end;
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz