Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Automatische Vervollständigung bei Eingabe? (https://www.delphipraxis.net/9453-automatische-vervollstaendigung-bei-eingabe.html)

mandumoal 26. Sep 2003 16:07


Automatische Vervollständigung bei Eingabe?
 
Hallo!

Weiss jemand wie ich eine Automatische Vervollständigung bei einer Eingabe realisieren kann?
Ich meine zum Beispiel in einem Edit oder ComboBox wenn mann 'Ha' eingibt, dass dann zum Beispiel dasteht
'Hallo'
und der Cursor hinter 'Ha' bleibt und bei Eingabe eines ls dann dasteht
'Hallo'
und so weiter.....
So wie zum Beispiel bei MS Outlook Express in der 'an:'-zeile wenn man einen Anfangsbuchstaben einer Kontaktperson eingibt.

Gibt es da eventuell eine Kompo oder so..?

mfg mandumoal

Alexander 26. Sep 2003 16:14

Re: Automatische Vervollständigung bei Eingabe?
 
Hi,
dir ist klar, dass die Daten hinterlegt werden müssen, oder?

Aber als kleiner Tip:
Die Combobox kann das, spiel mal ein wenig mit dem Style (siehe OI) herum

sakura 26. Sep 2003 16:15

Re: Automatische Vervollständigung bei Eingabe?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Du packst eine TComboBox aufs Form, setzt den Style auf csSimple und die Items StringListe füllst Du mit den Auto-Optionen.

Demo im Anhang.

...:cat:...

mandumoal 26. Sep 2003 16:19

Re: Automatische Vervollständigung bei Eingabe?
 
hi!

Das was die ComboBox kann ist zwar fast gut aber ich will nicht das sie sich bei der vervollständigung aufmacht!
und außerdem kann man nichts eigeben was nicht exsistiert!

Zitat:

dir ist klar, dass die Daten hinterlegt werden müssen, oder?
na klar :-D

mfg mandumoal

sakura 26. Sep 2003 16:20

Re: Automatische Vervollständigung bei Eingabe?
 
Den Style musst Du auf csSimple setzen, dann geht es genau so, wie Du es willst. Siehe Demo :!:

...:cat:...

mandumoal 26. Sep 2003 16:26

Re: Automatische Vervollständigung bei Eingabe?
 
Hi sakura!

Bei deiner Demo passiert bei mir garnichts wenn ich zum beispiel dre,ei,zwe oder so eingeb!

liegt das vielleicht daran, dass er die unit variants nicht gefunden hat und iich sie löschen musste?

mfg mandumoal

Alexander 26. Sep 2003 16:29

Re: Automatische Vervollständigung bei Eingabe?
 
Nein daran sollte es nicht liegen, hast du auch eins statt 1 eingeben? :mrgreen:
Und steht auch was in den Items bei dir drinne?

Memo 26. Sep 2003 16:30

Re: Automatische Vervollständigung bei Eingabe?
 
Zitat:

Zitat von mandumoal
Gibt es da eventuell eine Kompo oder so..?

Eine Komponente hab ich mal irgenwann gesucht, aber nicht gefunden.

In guter alter Handarbeit hab ich das schonmal erledigt. Der zu ergenzende Text stamm in dem fall aus einer Tabelle, aber das kann man sich ja umstellen wie mans braucht.
Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
var name1 :String;
    i : Integer;
begin
    name1 := Edit1.Text;
    i := Length(name1);
    if i > 0 then begin
     if Table.Locate('Name',VarArrayOf([name1]),[loPartialKey]) then //oder eine andere Quelle
     begin
      Edit1.Text := Table1.FieldbyName('Name').asString;
      i := Length(name1);
      Edit1.SelStart := i;
      Edit1.SelLength := length(Edit1.Text)-1
     end;
    end;
end;
Das einzigste was ich nicht hinbekommen habe war das der Cursor hinten am Text blinkte. Aber das ist reine Optik.

Memo 26. Sep 2003 16:36

Re: Automatische Vervollständigung bei Eingabe?
 
Ach ja, Sakuras Bsp. tut bei mir auch nichts. Liegt vieleicht doch an der Delphi-Version.

aps 26. Sep 2003 17:46

Re: Automatische Vervollständigung bei Eingabe?
 
Zitat:

Zitat von Memo
Ach ja, Sakuras Bsp. tut bei mir auch nichts. Liegt vieleicht doch an der Delphi-Version.

Das Autoausfüllen funktioniert erst ab Version 6.

eddy 27. Sep 2003 17:41

Re: Automatische Vervollständigung bei Eingabe?
 
Hallo mandumoal,

AutoFill für ComboBox, das hatten wir schon: DP Suche AutoFill für Combobox

Wenn das nicht weiterhilft, dann vielleicht das:
Delphi-Quellcode:
unit ComboBoxAF;  //ComboBox AutoFill

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TComboBoxAF = class(TComboBox)
  private
    { Private-Deklarationen }
    FAutoFill : Boolean;
    function GetAutoFill : Boolean;
    procedure SetAutoFill(value : Boolean);
  protected
    { Protected-Deklarationen }
    procedure ComboWndProc(var Message: TMessage; ComboWnd: HWnd;
                                                  ComboProc: Pointer); override;

  public
    { Public-Deklarationen }
    constructor Create(aOwner: TComponent); override;
    Destructor Destroy; override;
  published
    { Published-Deklarationen }
    property AutoFill : Boolean read GetAutoFill write SetAutoFill;
  end;

procedure Register;

implementation

procedure TComboBoxAF.ComboWndProc(var Message: TMessage; ComboWnd: HWnd;
                                                            ComboProc: Pointer);
var
  I: Integer;
  s: String;
begin
  inherited ComboWndProc(Message, ComboWnd, ComboProc);
  if not FAutoFill then Exit;
  // first check whether the backspace key was pressed, we do not fill in
  // in such case!
  if Message.Msg = WM_CHAR then begin
    // all characters from 32 (Space) through 127 (Upper ANSI) are matched
    if TWMChar(Message).CharCode in [$20..$7F] then begin
      // fill in the rest of the text
      // save the current text, the user has typed
      s := Text;
      // get the first string, matching the text partially
      I := SendMessage(Handle, CB_FINDSTRING, -1, LongInt(PChar(s)));
      if I >= 0 then begin
        // match found!
        // load matching text, I is the position of the matching string
        Text := Items.Strings[I];
        // select the text beyond the text typed
        SelStart := Length(s);
        SelLength := Length(Text) - Length(s);
      end;
    end;
  end;
end;


function TComboBoxAF.GetAutoFill : Boolean;
begin
  Result := FAutoFill;
end;

procedure TComboBoxAF.SetAutoFill(value : Boolean);
begin
  FAutoFill := value;
end;

constructor TComboBoxAF.Create(aOwner: TComponent);
begin
  inherited Create(aOwner);
  FAutoFill := true;
  Sorted := true;
end;

Destructor TComboBoxAF.Destroy;
Begin
  inherited Destroy;
End;

procedure Register;
begin
  RegisterComponents('Beispiele', [TComboBoxAF]); //
end;

end.
Ist mein letzter Bearbeitungsstand und funktioniert.

mfg
eddy

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]

mandumoal 27. Sep 2003 18:43

Re: Automatische Vervollständigung bei Eingabe?
 
Hi!

Ertsmal Vielen Dank für die Antworten!

Ich hab mal die Methode von eddy probiert und bin echt begeistert!
Danke!

Was wäre denn eurer Meinung nach die Beste Methode um Eintäge in die Combobox die noch nicht exsistieren zu den Items hinzuzufügen?
Die Items in einer Datei Speichern, beim Start laden und bei neuer eingabe zu Items hinzufügen und bei Beenden wieder in die Datei speichern (mittels Streams)?
Wäre das gut oder schlagt ihr was anderes vor?

mfg mandumoal

Alexander 28. Sep 2003 09:06

Re: Automatische Vervollständigung bei Eingabe?
 
Jupp mittels Stream oder wenn es nicht all zu viele sind mittels INI-DAtei

Phoenix 28. Sep 2003 09:23

Re: Automatische Vervollständigung bei Eingabe?
 
Zitat:

Zitat von mandumoal
Was wäre denn eurer Meinung nach die Beste Methode um Eintäge in die Combobox die noch nicht exsistieren zu den Items hinzuzufügen?
Die Items in einer Datei Speichern, beim Start laden und bei neuer eingabe zu Items hinzufügen und bei Beenden wieder in die Datei speichern (mittels Streams)?
Wäre das gut oder schlagt ihr was anderes vor?

Hrm. Also meine erste Idee wäre die Registry unter HKCU.
Ich würde eine standard - Liste der möglichen Einträge per .reg - File mitliefern. Das hat meines Erachtens den grossen Vorteil, daß die Einträge auf dem Zielrechner dann User-Spezifisch gespeichert werden.

Beispiel: (Ich weiss ja jetzt nicht, was das Ding hinterher machen soll, deswegen einfach mal fiktiv) User 1 benutzt das Ding hauptsächlich um Werte aus dem Fachgebiet Medizin einzugeben, User 2 nur für Computer-Begriffe. Wenn User 2 jetzt 'Kernel' eingeben will, und ihm bei "Ker" dann schon "Kernspintomograph" (war mal ne Eingabe von User 1) vorgeschlagen wird dürfte der ziemlich baff sein :lol:

Deswegen neben einem Standard-Wörterbuch nur noch Userspezifisch abspeichern. Die Registry empfiehlt sich hier eben sehr gut. In dem Moment biete ich in meinen Tool übrigens immer die Option "persönliche Einstellungen exportieren" an, die eben den kompletten Registry-Key in eine .reg exportiert. So kann man die sehr einfach sichern und auch mitnehmen.

mandumoal 28. Sep 2003 14:04

Re: Automatische Vervollständigung bei Eingabe?
 
HI!

Also es soll eigentlich nicht viele verschiedene Bereiche geben(Medizin,Computer...)
sondern nur um Mitarbeiter auszuwählen und eben gegebenfalls einen neuen einzugeben oder am anfang gar keine Items zu haben damit die Vervollständigung immer so aussieht wie der Benutzer sie zum ersten Mal eingegeben hat.

Wie liese sich denn das mit INI machen?
Muss ich einfach nur die Daten per Stream in ner INI speichern und dann wieder auslesen oder was kann man mit ner INI machen was mit zum Beispiel nem TXT nicht geht?
(Ach ja: Mit der Registry war zwar ne gute Idee aber ich wollte sowas eigentlich nicht machen weil sich manche aufregen, dass schon jedes kleinste Prog die Registry zukleistert)

mfg mandumoal

Christian Seehase 28. Sep 2003 14:06

Re: Automatische Vervollständigung bei Eingabe?
 
Moin mandumoal,

zum Thema Ini schau mal in der Hilfe nach TIniFile.
Eine Suche hier nach Hier im Forum suchenTIniFile sollte auch einige Fundstellen bringen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:12 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