Einzelnen Beitrag anzeigen

guidobrose
(Gast)

n/a Beiträge
 
#1

Allgemeine Frage zu Zuweisungen von Instanzen

  Alt 14. Jun 2007, 13:29
Hallo, ich habe zwar grad ein Tutorial durchgelesen, aber es werfen sich doch noch Fragen auf.

Ich habe zwei Instanzen z.B.
Delphi-Quellcode:
var Liste1, Liste2: TStringlist;

Liste1:=TStringlist.Create;
Liste2:=TStringlist.Create;
Durch diese Zuweisungen wird jetzt der notwendige Speicher für die Listen reserviert und der Zeiger darauf in "Liste1" und "Liste2" gespeichert, oder?
Liste2:=Liste1; Dies bewirkt nun das der Zeiger auf den Speicher von Liste1 auf Liste2 kopiert wird. Damit greifen beide Variablen nun auf den selben Speicherbereich (auf die gleiche Liste) zu. Der vorher zugewiesene Speicherbereich von Liste2 ist damit zwar noch im Speicher vorhanden, aber nicht mehr erreichbar (und damit verwaist), oder?

Delphi-Quellcode:
var Liste1, Liste2: TStringlist;

Liste1:=TStringlist.Create;
Liste2:=Liste1;
Das sollte demnach auch funktionieren, da ja durch die Variablendeklaration der Speicher für den Zeiger auf eine Liste erzeugt wurde und nun der Inhalt von Liste1 auch über Liste2 erreichbar ist, oder?

Jetzt noch eine etwas spezieller auf mein eigentliches Problem zugeschnittene Frage:
Ich möchte eine Klasse von TEdit ableiten und dieser eine Funktion Autocomplete verpassen. Für diese Funktion benötige ich natürlich auch eine Liste, die die Strings enthält, in denen gesucht wird. Also ungefähr so:
Delphi-Quellcode:
  TXTEdit = class(TEdit)
  private
    FAutocomplete: Boolean;
    FSearchList: TStringlist;
  protected
    procedure DoAutocomplete;
    procedure CMChanged(var Message: TMessage); message CM_CHANGED;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Autocomplete: Boolean read FAutocomplete write FAutocomplete default False;
    property Searchlist: TStringlist read FSearchlist write FSearchlist;
  end;
Meine Idee ist, irgendwo im aufrufenden Programm zu schreiben:
Delphi-Quellcode:
  MyEdit.Searchlist:=EineStringliste;
  MyEdit.Autocomplete:=True;
wobei EineStringliste einiges sein kann, z.B. EinStringGrid.Cols[0] oder EineListbox.Items

Leider funktioniert das nicht so ganz wie ich will, sondern führt noch zu einer Zugriffsverletzung. Eigentlich sollte es doch nicht notwendig sein eine Instanz von FSearchlist im constructor zu erzeugen, mir reicht es ja, den Zeiger auf die zugewiesenen Liste zu haben, oder? Ich habe zwar beide Varianten bereits ohne Erfolg ausprobiert, aber mir gehts darum grundsätzlich zu verstehen, ob das so gehen müsste.

Ich hoffe, jemand kann mir auf meine Anfängerfragen eine Antwort geben. Es ist echt tragisch, man glaubt, jetzt kann ich genug, um ohne Hilfe weiter zu kommen und schon stößt man auf das nächste Problem.

Guido
  Mit Zitat antworten Zitat