Einzelnen Beitrag anzeigen

guidobrose
(Gast)

n/a Beiträge
 
#8

Re: Allgemeine Frage zu Zuweisungen von Instanzen

  Alt 14. Jun 2007, 15:45
Danke für die Infos bisher

@Hawkeye: Nein, da verschwende ich keinen Gedanken daran, weil mir die Combobox nicht gefällt. Die Daten, mit denen mein Autovervollständigen arbeiten soll werden aus einem StringGrid kommen, das aus einer Datenbank gefüllt wird.

Ich habe jetzt mal was probiert, was sogar (weitgehend) funktioniert, aber noch Fragen bei mir aufwirft.

Delphi-Quellcode:
type

  TXTEdit = class(TEdit)
  private
    FAutocomplete: Boolean;
    FBAutocomplete: Boolean;
    FSearchList: TStrings;
    //FOnAutocomplete: TXTAutocompleteEvent;
  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 OnAutocomplete: TXTAutocompleteEvent read FOnAutocomplete write FOnAutocomplete;
    property Searchlist: TStrings read FSearchlist write FSearchlist;
  end;

  TForm3 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    Edit: TXTEdit;
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

constructor TXTEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FSearchlist:=TStrings.Create;
end;

destructor TXTEdit.Destroy;
begin
  FSearchlist.Free;
  inherited Destroy;
end;

procedure TXTEdit.DoAutocomplete;
var I, StartPos: Integer;
begin
  if assigned(FSearchlist) then
  begin
    for I:=0 to FSearchlist.Count-1 do
    begin
      if (Text='') or (LowerCase(FSearchlist.Strings[I])=LowerCase(Text)) then
      begin
// if assigned(FOnAutocomplete) then
// OnAutocomplete(I);
        Exit;
      end;
      if StrLComp(PChar(LowerCase(FSearchlist.Strings[I])), PChar(LowerCase(Text)),
        Length(Text)) = 0 then
      begin
        StartPos := Length(Text);
        Text := Text + Copy(FSearchlist.Strings[I], StartPos + 1, Length(FSearchlist.Strings[I]));
        SelStart := StartPos;
        SelLength := Length(Text) - StartPos;
// if assigned(FOnAutocomplete) then
// OnAutocomplete(I);
        Exit;
      end;
    end;
  end;
end;

procedure TXTEdit.CMChanged(var Message: TMessage);
begin
  if FAutocomplete then
    DoAutocomplete;
  inherited;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  Edit:=TXTEdit.Create(self);
  Edit.Parent:=Form3;
  Edit.Searchlist:=Listbox1.Items;
end;

procedure TForm3.FormDestroy(Sender: TObject);
begin
  Edit.Searchlist:=nil; //Warum brauche ich das???
end;

end.
Wenn ich die Zeile in FormDestroy nicht einfüge, dann kommt es zu einer ungültigen Zeigeroperation. Warum?
  Mit Zitat antworten Zitat