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.
combobox individuell
-
- 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
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?
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?
-
- 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
"...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)
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.
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.}
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.
-
- 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
Stimmt.
Ich meinte ja auch SetDroppedDown
(das wird immer aufgerufen wenn die Kombobox aus oder eingeklappt wird, oder genauer: DAS klappt die Kombobox aus
)
Ich meinte ja auch SetDroppedDown


-
- 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
Das mag gehen, ich werde es demnächst testen, wenn ich das als neue Komponente programmiere.Teekeks hat geschrieben:SetDroppedDown
mittlerweile funktioniert das Folgende prächtig mit "abort"

(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;
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