AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

AccessViolation im OnKeyPress

Ein Thema von Blaubaer · begonnen am 26. Aug 2003 · letzter Beitrag vom 30. Aug 2003
Antwort Antwort
Blaubaer

Registriert seit: 26. Aug 2003
2 Beiträge
 
#1

AccessViolation im OnKeyPress

  Alt 26. Aug 2003, 13:58
Hallo,

ich erstelle zur Laufzeit 2 Editkomponenten und eine TList in der die Zeiger auf die Edits verwaltet werden. Das funktioniert auch alles bestens. Probleme treten auf beim freigeben der Edits.

So erzeuge ich die Edits:
Delphi-Quellcode:
procedure TForm1.CreateADVEdits;
var i, links, oben, breit, hoch : integer;
begin
  EditListe := TList.create;

  Links := 40;
  oben := 150;
  breit := 40;
  hoch := 21;
  
  for i := 1 to 3 do
    begin
      MyEdit := TEdit.create(self);
      MyEdit.Parent := self;
      MyEdit.Name := 'MyADVEdit' + inttostr(i);
      MyEdit.Setbounds(links+(i-1)* breit, oben, breit, hoch);
      EditListe.add(MyEdit);
      TEdit(EditListe.Items[i-1]).Text := inttostr(i);
      TEdit(EditListe.Items[0]).setfocus;
    end;
end;
So geb ich den Speicher wieder frei:
Delphi-Quellcode:
Procedure TForm1.DestroyADVEdits;
begin
  while EditListe.Count > 0 do
    begin
      TEdit(EditListe.Items[0]).free;
      EditListe.Delete(0);
    end;
end;
Die beiden Proceduren werden mittels zweier Buttons aufgerufen. Jetzt zum Problem:
************************************************** **********
Wenn das erste (und nur dann) Edit den Fokus hat und ich mit der Maus auf den Button zum freigeben klicke klappt alles. Ordne ich dem Button jedoch im OnkeyDown des Formulars eine F Taste zu und drücke zum freigeben die F-Taste, bekomme ich einen AccessViolation am Schluss der
Anwendung. Ich weiß nicht mehr wo ich noch suchen soll, ich finds nicht.
************************************************** **********

Ich hab schon gedacht es läg an den Buttons weil ich Speedbuttons verwende aber mit andere Buttons tritt der Fehler auch auf.
Der Vollständigkeithalber hier noch das OnKeyDown und das Keypress Ereignis des Formulars:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Edit1.Setfocus;
  case key of
    Vk_F7 : SpeedButton1Click(Form1);//CreateADVEdits;
    Vk_F8 : SpeedButton2Click(Form1);//DestroyADVEdits;
  end;
end;


procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
//keyPreview ist true.
  if key = #13 then
    begin
      Self.Perform(WM_NEXTDLGCTL, 0, 0);
      key := #0;
    end;
end;
Vielleicht hat jemand von euch noch ne Idee worans liegen könnte.
Gruß
Sebastian

[edit=Luckie]Delphi-Tags hinzugefügt. Beim nächsten mal bitte selber machen. Danke. Mfg, Luckie[/edit]
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: AccessViolation im OnKeyPress

  Alt 29. Aug 2003, 23:05
Moin Sebastian,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Da Du die Edits mit Create(self) erzeugst, brauchst Du sie nicht selber wieder freizugeben, das geschieht automatisch, wenn das Form1 zerstört wird.
Die Routinen sehen ja soweit gut aus.
Was passiert wenn Du mal in der Destroy Routine die Edits nicht freigibst, sondern nur auf unsichtbar setzt, und dann das Programm beendest.

Ich habe die Vermutung, dass der Fehler woanders liegt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Blaubaer

Registriert seit: 26. Aug 2003
2 Beiträge
 
#3

Re: AccessViolation im OnKeyPress

  Alt 30. Aug 2003, 01:00
Hallo Christian,

vielen Dank erstmal für das nette "Willkommen".
Ich konnte das Problem heute lösen. Mir ist klar das ich die Edits nicht extra freigeben wenn ich self verwende. Ich erstelle die Edits aber eigentlich nicht wie hier getippt mit self sonder mit NIL was aber keinen Einfluß auf den Fehler hatte.

Das Problem lag im OnKeyDown Ereignis des Formulars. Der key wurde nachdem er verarbeitet wurde dann an die bereits zerstörte EditKomponente geschickt und dadurch entstand der Fehler. Die Lösung sieht jetzt ganz einfach so aus:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Edit1.Setfocus;
case key of
Vk_F7 : begin
SpeedButton1Click(Form1);//CreateADVEdits;
key := 0;// Das ist die Lösung des Problems
end;

Vk_F8 : begin
SpeedButton2Click(Form1);//DestroyADVEdits;
key := 0;
end;
end;
end;

Trotzdem vielen Dank für Deine Zeit. Ich werd sicher hier dabei bleiben gefällt mir sehr gut hier. Plant ihr eventuell auch Treffen oder vielleicht einen Stammtisch ?

Vielen Dank und viele Grüße
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz