Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi pointer auf TButton - verständtnis problem (https://www.delphipraxis.net/129836-pointer-auf-tbutton-verstaendtnis-problem.html)

cherry 26. Feb 2009 14:17


pointer auf TButton - verständtnis problem
 
hallo

ich habe folgenden code:

Delphi-Quellcode:

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;
Habe die Zeile markiert wo ich die "Zugriffsverletzung" erhalte. Irgendwas ist mir noch nicht ganz klar mit pointern...
Kann mit jmd helfen? Warum kriege ich da eine Zugriffsverletzung?

himitsu 26. Feb 2009 14:28

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:
Tabs[current].P := NewButton;

Tabs[i].P.Caption := 'homo';
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.

mkinzler 26. Feb 2009 14:29

Re: pointer auf TButton - verständtnis problem
 
Ein TButton ist schon eine Referenz (Zeiger)

cherry 26. Feb 2009 14:30

Re: pointer auf TButton - verständtnis problem
 
Zitat:

Zitat von himitsu
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;

hmm, kappier ich nicht?! wieso ist das schon ein Pointer? und trotzdem, warum geht meine version nicht?

himitsu 26. Feb 2009 14:32

Re: pointer auf TButton - verständtnis problem
 
Eine Objektinstanz ist sozusagen ein Zeiger auf die Daten des Objektes.

[info] hatte oben etwas dazueditiert :zwinker:

cherry 26. Feb 2009 14:34

Re: pointer auf TButton - verständtnis problem
 
Zitat:

Zitat von himitsu
Eine Objektinstanz ist sozusagen ein Zeiger auf die Daten des Objektes.

[info] hatte oben etwas dazueditiert :zwinker:

hmm, wenn das so ist für was braucht man dann Pointer in Delphi überhaupt? (also ich meine selbst "erstellte")

mkinzler 26. Feb 2009 14:35

Re: pointer auf TButton - verständtnis problem
 
Für Klassen nicht.

cherry 26. Feb 2009 14:36

Re: pointer auf TButton - verständtnis problem
 
Zitat:

Zitat von mkinzler
Für Klassen nicht.

Also zum Beispiel für Typen und Variablen dann?

Neutral General 26. Feb 2009 14:37

Re: pointer auf TButton - verständtnis problem
 
Für elementare Datentypen und für Records brauch man sie ggf.

cherry 26. Feb 2009 14:38

Re: pointer auf TButton - verständtnis problem
 
Zitat:

Zitat von Neutral General
Für elementare Datentypen und für Records brauch man sie ggf.

hmm, also sind Pointer in Delphi eher selten?!

Meflin 26. Feb 2009 14:43

Re: pointer auf TButton - verständtnis problem
 
Zitat:

Zitat von cherry
hmm, also sind Pointer in Delphi eher selten?!

Korrekt, deswegen mögen wir es ja so :mrgreen:

cherry 26. Feb 2009 14:45

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)

himitsu 26. Feb 2009 14:49

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:
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;
und Freigeben dann z.B. so:
Delphi-Quellcode:
Tabs[i].P^.Free;
Dispose(Tabs[i].P);
aber direkt über die Objektinstanz isses natürlich einfacher/schöner :angel2:

Cyf 26. Feb 2009 15:31

Re: pointer auf TButton - verständtnis problem
 
Zitat:

Zitat von cherry
hmm, wenn das so ist für was braucht man dann Pointer in Delphi überhaupt? (also ich meine selbst "erstellte")

Für Abstrakte Datentypen, wie z.B. verkettete Listen, Binärbäume und nen paar andere und in einigen speziellen Fällen, wo Lösungen ohne Pointer nicht oder nur unschön gehen. Hinzu kommt noch die Übergabe von Strings an API-Schnittstellen und .dll oder wenn man aus irgendwelchen Gründen meint, direkt im virtuellen Speicher rumhantieren zu müssen. Die meisten Pointer in Delphi werden automatisch verwaltet und hinter Dingen wie var, const, Arrays und Objekten versteckt.

cherry 26. Feb 2009 15:33

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

himitsu 26. Feb 2009 15:35

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 23:01 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