AGB  ·  Datenschutz  ·  Impressum  







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

Zugriffsverletzung bei free?

Ein Thema von Hyperspacer · begonnen am 4. Mär 2007 · letzter Beitrag vom 8. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2      
Hyperspacer

Registriert seit: 23. Apr 2006
53 Beiträge
 
Delphi 7 Personal
 
#1

Zugriffsverletzung bei free?

  Alt 4. Mär 2007, 19:07
Ich beiß gleich in die tischkante..

Ich erstelle dynamisch ein Tedit, dem ich zwei ereignisproceduren zuweise:
Delphi-Quellcode:
with TEdit.Create(form1) do
  begin
    Parent := Form1;
    Top := 50;
    Left := 100;

    SetFocus;

    OnExit := ItemEditOnExit;
    OnKeyDown := ItemEditOnKeyDown;
  end;
So weit so gut. Hier nun die Proceduren:
Delphi-Quellcode:
procedure TForm1.ItemEditOnExit(Sender: TObject);
begin
  ListView1.ItemFocused.SubItems.Strings[0] := (Sender as TEdit).Text;
  Sender.Free;
end;

procedure Tform1.ItemEditOnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  If Key = VK_Return then
    begin
      ListView1.ItemFocused.SubItems.Strings[0] := (Sender as TEdit).Text;
      Sender.Free;
    end;
end;
Wenn die OnExit Procedure ausgeführt wird, geht alles glatt. Aber wenn die OnKeyDown Procedure ausgeführt wird gibt es eine wunderschöne Zugriffsverletzung nachdem Free.
Ich habe schon versucht das Edit nicht in der OnKeyDown Procedure zu freen, sondern von dort die OnExit Procedure auszuführen, was allerdings zum selben Fehler führte.

Wer kann mir sagen wie ich diesen Fehler beheben oder umschippern kann?

mfg
Daniel
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Zugriffsverletzung bei free?

  Alt 4. Mär 2007, 19:21
Delphi-Quellcode:
procedure Tform1.ItemEditOnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  If Key = VK_Return then
    begin
      ListView1.ItemFocused.SubItems.Strings[0] := (Sender as TEdit).Text;
      TEdit(Sender).OnExit := nil; // <---
      Sender.Free;
    end;
end;
Schreib das mal so.. Is nur son Gefühl...
Keine Garantie!

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Zugriffsverletzung bei free?

  Alt 4. Mär 2007, 19:29
innerhalb eines Events sollte man NIE die Komponente frei geben denn das Event ist etwa so aufgebaut
Delphi-Quellcode:
//Wenn OnChange zugewiesen ist
if Assigned(OnChange) then
  OnChange(Self); //OnChange aufrufen
Self.DoAnything; //Wenn jetzt die Componente im OnChange freigegeben wurde knallts weil Self ja nicht mehr auf was gültiges zeigt sondern frei gegeben wurde
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Hyperspacer

Registriert seit: 23. Apr 2006
53 Beiträge
 
Delphi 7 Personal
 
#4

Re: Zugriffsverletzung bei free?

  Alt 4. Mär 2007, 19:41
Danke für die schnellen Antworten!

@SirThornberry:
Klingt logisch aber da gibt es nochetwas.
Ich erstelle das Edit zum ersten mal. Dann schreibe ich irgendetwas hinein und drücke "Enter". Peng Fehler. Das Edit ist nach dem Fehler wenigstens nicht mehr zu sehen, ob es auch wirklich weg ist kann ich nichtsagen. Der Text wurde erfolgreich in die Liste geschrieben. Wenn ich jetzt erneut ein Edit erstelle, etwas hineinschreibe und "enter" drücke gibt es KEINEN fehler!
Jetzt bin ich völlig verwirrt.

Edit: Überigens herzlichen Glückwunsch zum 6.666sten Beitrag
  Mit Zitat antworten Zitat
Benutzerbild von TonyR
TonyR

Registriert seit: 17. Jun 2006
Ort: Bautzen
503 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Zugriffsverletzung bei free?

  Alt 4. Mär 2007, 20:39
Ich weis ja nicht, was du vor hast, aber wäre es nicht auch eine Idee, das Edit im Designer oder von mir aus im Oncreate zu erstellen und es erst beim schließen des Progs wieder Freizugeben???
Um es zwischenzeitlich unsichtbar zu machen, kann man ja Hide benutzen
Es ist unmöglich, witzig zu sein ohne ein bisschen Bosheit. Die Bosheit eines guten Witzes ist der Widerhaken, der ihn haften lässt. - Georg Christoph Lichtenberg
  Mit Zitat antworten Zitat
Hyperspacer

Registriert seit: 23. Apr 2006
53 Beiträge
 
Delphi 7 Personal
 
#6

Re: Zugriffsverletzung bei free?

  Alt 4. Mär 2007, 20:51
Manchmal sind die Antworten so einfach!
Nur der Vollständigkeit halber: Ich habe ein Listview und will auch die subitems direkt editieren können. dafür hatte ich vor (was auch soweit funktioniert) bei einem doppelklick auf einen bestimmten eintrag im listview ein editfeld an dieser stelle zu erstellen mit dem man dann den eintrag bearbeiten kann.
Aber man kann ja auf einfach eins von anfang an erstellen, unsichtbar machen und dann immer an die richtige stelle verschieben und sihtbar machen...

okay danke an euch alle!
... Obowhl ich den fehler schon komisch finde

mfg
Daniel
  Mit Zitat antworten Zitat
SirTwist

Registriert seit: 28. Sep 2006
196 Beiträge
 
Delphi XE Professional
 
#7

Re: Zugriffsverletzung bei free?

  Alt 4. Mär 2007, 22:15
Zitat von Hyperspacer:
... Obowhl ich den fehler schon komisch finde
Mit diesem Code hier:
Delphi-Quellcode:
with TEdit.Create(form1) do begin
  ...
end;
legst Du zwar ein TEdit an und initialisierst du es, aber direkt nach dem End wird es wieder freigegeben, weil du es keiner Variablen zuweist. Und damit arbeiten all deine Routinen, die du zuweist, im luftleeren Raum, und dein Sender.Free gibt bereits freien Speicher nochmal frei.

Wenn Du schon Controls on-the-fly erzeugen willst, musst Du sie in einer Variable speichern, und zwar keiner lokalen innerhalb der Prozedur, sondern innerhalb der aktuellen Klasse/des aktuellen Forms:

Delphi-Quellcode:
  tmp_edit := TEdit.Create(form1);
  with tmp_edit do begin
    tmp_edit.Parent := form1;
  end;
und dann spätestens im FormClose-Event:
  FreeAndNil(tmp_edit);
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

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

Re: Zugriffsverletzung bei free?

  Alt 4. Mär 2007, 22:21
Moin Daniel,

nur um das

Zitat von Hyperspacer:
Wenn ich jetzt erneut ein Edit erstelle, etwas hineinschreibe und "enter" drücke gibt es KEINEN fehler!
mal zu klären.

Wenn Du das Free ausführst, wird der Speicher, den die Komponente belegt hat, zur erneuten Verwendung freigegeben.
Je nach Konstellation kann es dabei auch vorkommen, das die Komponente dennoch so vollständig erhalten bleibt, das spätere Zugriffe darauf noch einwandfrei funktionieren, es kann aber auch sein, dass entscheidende Bereiche schon wieder überschrieben wurden => AV.

Du kannst das vergleichen mit dem Löschen einer Datei.
Wenn danach noch nicht viel auf der Platte geändert wurde, stehen die Chancen recht gut diese wiederherstellen zu können, es können aber auch schon Bereiche davon überschrieben worden sein.
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
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#9

Re: Zugriffsverletzung bei free?

  Alt 4. Mär 2007, 22:25
Hallo,

nur um das geradezurücken:
Zitat von SirTwist:
Mit diesem Code hier:
Delphi-Quellcode:
with TEdit.Create(form1) do begin
  ...
end;
legst Du zwar ein TEdit an und initialisierst du es, aber direkt nach dem End wird es wieder freigegeben, weil du es keiner Variablen zuweist. Und damit arbeiten all deine Routinen, die du zuweist, im luftleeren Raum, und dein Sender.Free gibt bereits freien Speicher nochmal frei.
Diese Aussage ist natürlich Blödsinn. Das Objekt wird nicht freigegeben (Delphi-Klassen besitzen keine Referenzzählung und Delphi hat auch keinen GC). Es existiert nur keine Variable, mit der das Objekt angesprochen werden kann.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Zugriffsverletzung bei free?

  Alt 4. Mär 2007, 23:57
edit: stand schon irgendwo
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:56 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