![]() |
wie kann ein Objekt einer TList seinen Index erfahren
Hallo,
habe eine TObjectList mit Zeilen aus Steuerelementen, unter anderem eine ComboBox. Im OnChange der ComboBox möchte ich jetzt gerne auf das vorhergehende Objekt der Liste zugreifen (etwas in ein TEdit schreiben) Wie geht das? Bei den Methoden gibt es TObjectList.IndexOf, da bekomme ich aber immer nur -1 raus, wenn ich den Sender übergebe. Grüße, Messie |
Re: wie kann ein Objekt einer TList seinen Index erfahren
Auch wenn ich keinen Vorteil erkennen kann - bei mir funktioniert das:
Delphi-Quellcode:
Grüße vom marabu
procedure TDemoForm.Edit2Change(Sender: TObject);
var i: Integer; begin i := ol.IndexOf(Sender); if (i > 0) and (ol[Pred(i)] is TEdit) then TEdit(ol[Pred(i)]).Text := '???'; end; |
Re: wie kann ein Objekt einer TList seinen Index erfahren
Hallo Marabu,
was meinst Du mit "kann keinen Vorteil erkennen"? Ich hatte gedacht, es funzt im Builder wie in Delphi. Was wird denn bei Delphi im Sender anders als im Builder übergeben? Das scheint ja mein Problem zu sein.
Code:
Ich bekomme in i immer -1, also kann die Funktion meine Übergabe von Sender nicht finden.
void __fastcall TParaLine::MyComboChange(TObject *Sender)
{ int i; i = GlobalList->IndexOf(Sender); GlobalList->Items[i-1]->Edit := 'so gehts!'; } Grüße, Messie |
Re: wie kann ein Objekt einer TList seinen Index erfahren
Hi Messie,
ich finde die Kopplung zweier Komponenten über die Reihenfolge des Einfügens in eine ObjectList ungewöhnlich. Ich würde eine custom message senden oder die andere Komponente direkt im event handler ansprechen - aber du wirst schon einen guten Grund haben. Freundliche Grüße marabu |
Re: wie kann ein Objekt einer TList seinen Index erfahren
Zitat:
Hast Du einen Vorschlag, wie das sinnvoll lösen kann? Grüße, Messie |
Re: wie kann ein Objekt einer TList seinen Index erfahren
Ich kann dir nicht folgen. Du benutzt eine ObjectList um Parameterzeilen auf einer Form zu plazieren? Da kann ich mir nichts drunter vorstellen. Und was meinst du mit Zeile?
marabu |
Re: wie kann ein Objekt einer TList seinen Index erfahren
Zitat:
Zusammenfassend: im Prinzip geht es um die aufgabenbezogene Darstellung von irgendwelchen Wertelisten, wobei die Ereignisroutinen der Steuerelemente nur Eingabehilfen sind. Die aktuelle Aufgabe: ich habe eine Liste mit Materialien, deren Auswahl sich auf zwei Zeilen auswirkt. Bediener kann die Parameter k1 und k2 von Hand eintragen (hier geht es um Dichte und spezifische Wärmekapazität, jeweils eine Zeile) oder ein Material auswählen, denen die beiden Werte zugeordnet werden. Ich möchte z.B. also für das Material <Grappa> die Dichte in der Dichtezeile und die spezifische Wärmekapazität in der Zeile für Wärmekapazität haben und da liegt mein Problem: in eine Zeile passen nicht alle Eingabefelder mit Bezeichner und Einheit. Ich hoffe, das war jetzt eindeutig. Ich hatte gehofft, nicht soviel Text abladen zu müssen, andererseits bohre ich selbst gerne mal nach um ein Problem zu verstehen. Grüße, Messie P.S. Manchmal ist es auch gut, die Aufgabenstellung aufzuschreiben und nochmal durchzulesen. Mir ist eben der Gedanke gekommen, daß ich den Zeilen noch Events zuweisen könnte, die unabhängig von den Steuerelementen sind. War es das, was Du mit den custom messages meintest? |
Re: wie kann ein Objekt einer TList seinen Index erfahren
Du hast also gruppierte (TGroupBox) Controls, die sich innerhalb ihrer eigenen Gruppe gegenseitig beinflussen und von außerhalb der Gruppe beinflusst werden können. Custom (User) Messages sind Nachrichten Codes (wie WM_CHAR), die deine Anwendung nicht verlassen. Du definierst sie global als Konstanten mit dem Offset WM_USER. Dazu passend deklarierst du einen eigenen message record.
Wenn du dann ein anderes Control in der gleichen Gruppe verändern willst, schickst du im OnChange Event deine Nachricht los anstatt das andere Control zu lokalisieren und direkt zu verändern. Blöd ist nur, dass die einzelnen Controls deine custom messages verstehen müssen. Dazu müssen abgeleitete Komponenten verwendet werden (mein Favorit) oder die WindowProc der Controls muss ausgetauscht werden (nicht so übersichtlich). Im (unvollständigen) Beispiel soll eine Änderung von Edit1 in Edit2 einen abgeleiteten Wert anzeigen:
Delphi-Quellcode:
marabu
const
CM_MESS = WM_USER + 0; type TWMMessDaten = packed record Msg: Cardinal; From: TWinControl; Data: Pointer; Result: Longint; end; procedure TDemoForm.Edit1Change(Sender: TObject); var MessDaten: TWMMessDaten; begin with Messdaten do begin Msg := CM_MESS; From := TWinControl(Sender); Data := ... Result := 0; end; // Die GroupBox ist der message dispatcher Edit1.Parent.BroadCast(MessDaten); // Auswerten von Result ... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 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