combobox individuell

Rund um die LCL und andere Komponenten
Antworten
arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

combobox individuell

Beitrag von arturx »

Eine tdblookupcombobox (bzw. eine tcombobox) soll nicht ihre eigene Liste aufrufen (und zeigen),
sondern eine beliebig definierbare anderen Komponente (oder Form) aufrufen.
So wäre z.B. Tvirtualtree oder beliebig andere als Auswahlkomponente nutzbar.
In Kürze : ich möchte die tdblookupcombobox individualisieren.
Lässt sich das überhaupt umsetzen ?
Bis jetzt hatte ich nur die Idee, in "ondropdown" einen timer aufzurufen,
der die 1-Zeilen-Liste durch das gewünschte "pick-Formular" nach extrem kurzer Zeitverzögerung überschreibt.
Aber richtig toll ist diese Lösung nicht, vielleicht gibt es ja ein wesentlich eleganteres Vorgehen.

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: combobox individuell

Beitrag von Teekeks »

Ja das geht.
Ich habe mich in letzter Zeit etwas Intensiver mit Comboboxen beschäftigt.

Du musst dir eine Komponente von TCustomCombobox ableiten und dann dies hier bei protected reinschreiben:
procedure DropDown; override;
Hier kannst du dann deine Komponente auf das DropDown-Menu Zeichnen.
Achja! nicht das inherited; vergessen!

BTW: Wie Zeichnest du diese beliebige Komponente da drauf?
Über das Handle oder was?

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: combobox individuell

Beitrag von arturx »

"...dropdown überschreiben"
Das löst mein Problem leider nicht :(
Während der Testphase kann der Aufrufcode genauso gut in ondropdown stehen,
da dropdown auch nur ondropdown aufruft.
(Später, wenn alles funktioniert, wird das natürlich in die komponente eingebaut)

Code: Alles auswählen

Zur näheren Erläuterung des Problems :
 
procedure TForm1.ComboBox1DropDown(Sender: TObject);
      begin  timer1.Enabled  := true;
    end;   
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   timer1.enabled        := false;              //stoppen bis zum nächsten Mal
  { form2.left := xxx form2.top := yyy;         //.....positioniere Form zur combobox.....}
    form2.visible         := not form2.Visible; //ausfahren, einfahren
    combobox1.DroppedDown := false;             // Original-Liste wieder einziehen
end;
 
{Zusätzlich muss auch noch screen.OnActiveControlChange einbezogen werden, 
 damit die lookupform auch beim Verlassen des Ensembles wieder eingefahren wird.}
Ohne den Umweg über den timer klappt das Ein-Ausfahren (bis jetzt ?) nicht.
Es muss offensichtlich ein unabhängiger Prozess gestartet werden.
Das Ziel ist : beliebig individuelle lookup Elemente (Trees, Grids,Listen, indiv. Forms....)
als dropped-Elemente nutzen zu können und diese völlig von der Combobox zu isolieren.

Später werden dann noch die ergänzenden Eigenschaften zur (db) combobox dazugebaut :
1.positioning : (left,right,above,sub)
2.dropdownappearence : (form als child des Hauptformulars oder als eigenständiges Formular)
3.usw
Auch die Synchronsierung zwischen combox.text, keyfield, fk_keyfield und dropped.text muss noch erstellt erstellt werden.
Ich hoffe, dass nun meine Absicht etwas besser nachvollziehbar ist.

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: combobox individuell

Beitrag von Teekeks »

Stimmt.
Ich meinte ja auch SetDroppedDown :) (das wird immer aufgerufen wenn die Kombobox aus oder eingeklappt wird, oder genauer: DAS klappt die Kombobox aus :) )

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: combobox individuell

Beitrag von arturx »

Teekeks hat geschrieben:SetDroppedDown
Das mag gehen, ich werde es demnächst testen, wenn ich das als neue Komponente programmiere.

mittlerweile funktioniert das Folgende prächtig mit "abort" :mrgreen:
(manchmal sieht man den Wald vor Bäumen nicht)
der timer entkoppelt weiterhin das Verhalten der Combobox und das hide_and_show des Formulars.

Code: Alles auswählen

procedure TForm1.ComboBox1DropDown(Sender: TObject);
      begin  timer1.Enabled  := true;
           // hier steht noch der Code für : merke_comboboxUNDdropdownformular; --> für screen.onchangecontrol; s.u.
              abort;       // <-------  Original-Liste garnicht erst zeigen 
    end;   
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   timer1.enabled        := false;              //stoppen bis zum nächsten Mal
  { form2.left := xxx form2.top := yyy;         //.....positioniere Form zur combobox.....}
    form2.visible         := not form2.Visible; //ausfahren, einfahren
end;
 
{Nur der Vollständigkeithalber das Prinzip für screen.onchangeControl :
                 1.If not ((screen.activecontrol = combobox) or
                              (screen.acitvecontrol is child_of_form2))
                               then begin hide_form2;
                                          vergiss combobox
                                          vergiss form2
                                     end;
Wer Interesse hat an dem Code hat (?Teekeks?), soweit er bis jetzt geschrieben ist, kann sich gern melden.
Da die Lookups ja auch beliebig tief gestaffelt sein können, habe ich alles bis auf ondropdown
in ein eigenständiges Objekt ausgelagert. Dieses verwaltet auch den Stack,
der beinhaltet, welche combobox & form gerade aktuell sind.

----------------------------------- Hinweis für die Nutzung der Lookupform (i.e.Form2) -----------------
Wenn form2.parent := form1 , dann muss unbedingt form2.borderstyle auf bsnone gesetzt werden
(siehe mein Bugreport vom 16.08.2010) da sonst die Fokussierung per Maus nicht in allen Fällen möglich ist

Antworten