![]() |
pointer auf TButton - verständtnis problem
hallo
ich habe folgenden code:
Delphi-Quellcode:
Habe die Zeile markiert wo ich die "Zugriffsverletzung" erhalte. Irgendwas ist mir noch nicht ganz klar mit pointern...type Tabulator = record hwnd: THandle; // contains handle of a window P: ^TEButton; // contains pointer of the tabulator button end; ... var Tabs: array of Tabulator; procedure TForm1.AddTab(name: String; hwnd: THandle; FormCount: Integer); var Current: Integer; NewButton: TEButton; begin // increase pointer array SetLength(Tabs, Length(Tabs) + 1); Current := Length(Tabs)-1; // create button, positionize button NewButton := TEButton.Create(Form1); NewButton.Parent := ToolBar1; NewButton.OnClick := OnTabButtonClick; Tabs[current].P := @NewButton; Tabs[current].hwnd := hwnd; end; function TForm1.RemoveTab(hwnd: Cardinal): Boolean; var I: Integer; begin result := false; for I := 0 to Length(Tabs) -1 do begin if Tabs[i].hwnd = hwnd then begin Tabs[i].P^.Caption := 'homo'; <--- Zugriffsverletzung !!! // Tabs[i].hwnd := 0; // Tabs[i].P := nil; result := True; break; end; end; end; Kann mit jmd helfen? Warum kriege ich da eine Zugriffsverletzung? |
Re: pointer auf TButton - verständtnis problem
TButton ist im Prinzip schon ein Pointer ... nimm einfach direkt TEButton.
Delphi-Quellcode:
Tabulator = record
hwnd: THandle; // contains handle of a window P: TEButton; // contains pointer of the tabulator button end;
Delphi-Quellcode:
PS: @NewButton zeigt auf die Variable NewButton und nicht auf den Button selbst und diese Variable gibt es nicht mehr, nachdem die Prozedur dazu beendet wurde.
Tabs[current].P := NewButton;
Tabs[i].P.Caption := 'homo'; |
Re: pointer auf TButton - verständtnis problem
Ein TButton ist schon eine Referenz (Zeiger)
|
Re: pointer auf TButton - verständtnis problem
Zitat:
|
Re: pointer auf TButton - verständtnis problem
Eine Objektinstanz ist sozusagen ein Zeiger auf die Daten des Objektes.
[info] hatte oben etwas dazueditiert :zwinker: |
Re: pointer auf TButton - verständtnis problem
Zitat:
|
Re: pointer auf TButton - verständtnis problem
Für Klassen nicht.
|
Re: pointer auf TButton - verständtnis problem
Zitat:
|
Re: pointer auf TButton - verständtnis problem
Für elementare Datentypen und für Records brauch man sie ggf.
|
Re: pointer auf TButton - verständtnis problem
Zitat:
|
Re: pointer auf TButton - verständtnis problem
Zitat:
|
Re: pointer auf TButton - verständtnis problem
Ok, dann hab ich ja wieder was gelernt. Also nochmal, wenn ich einer Procedure den Sender als TObject übergebe, ist das auch ein "Pointer" ? (Weil ja TObject auch eine Klasse ist)
|
Re: pointer auf TButton - verständtnis problem
Jupp, so isses. :angel:
Du kannst (wenn du unbedingt willst) ein Objekt auch über einen Pointer ansprechen, aber dann mußt du auch einen Speicherplatz (für die Objekt-Variable) nutzen, welcher nicht gelöscht wird.
Delphi-Quellcode:
und Freigeben dann z.B. so:
type
PEButton = ^TEButton; Tabulator = record hwnd: THandle; // contains handle of a window P: PEButton; // contains pointer of the tabulator button end; ... procedure TForm1.AddTab(name: String; hwnd: THandle; FormCount: Integer); var Current: Integer; NewButton: PEButton; begin // increase pointer array SetLength(Tabs, Length(Tabs) + 1); Current := Length(Tabs)-1; // create button, positionize button New(NewButton); NewButton := TEButton.Create(Form1); NewButton.Parent := ToolBar1; NewButton.OnClick := OnTabButtonClick; Tabs[current].P := @NewButton; Tabs[current].hwnd := hwnd; end;
Delphi-Quellcode:
aber direkt über die Objektinstanz isses natürlich einfacher/schöner :angel2:
Tabs[i].P^.Free;
Dispose(Tabs[i].P); |
Re: pointer auf TButton - verständtnis problem
Zitat:
|
Re: pointer auf TButton - verständtnis problem
Danke euch allen. Das ist die Erleuchtung des Tages für mich. :stupid: ne im Ernst. Gut zu wissen.
schöner Tag noch |
Re: pointer auf TButton - verständtnis problem
Strings, dynamische Arrays und Objekte arbeiten sozusagen mit Pointern, nur daß an sich als Programmier da um nichts kümmern muß (macht Delphi automatisch).
Und bei den Funtions-Parametern, sowie noch einigen anderen Dingen, macht Delphi auch sehr viel automatisch. ich weiß ja nicht wie sehr du dich z.B. in C auskennst, aber da muß man schon recht viel selber machen. :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:31 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