![]() |
Combobox ItemIndex=-1; Text ändern im Event
Hallo zusammen!
Ich benutze eine Combobox, um darin das Dateiformat einer dargestellten Datei zu verwalten. Bekannte Formate werden als Items geladen. Wird eine Datei mit unbekanntem Format geladen, kann diese (mit Einschränkungen) trotzdem Angezeigt werden. Dann bleibt die Combobox auf dem Index -1 und der Text wird in 'nicht gültig' geändert. Soweit so gut, funktioniert prima. Jetzt wollte ich aber die eigentliche Funktion für die die Combobox vorgesehen ist programmieren: Eine Formatkonvertierung. Das habe ich auch gemacht und auch das funktioniert. Ich habe allerdings ein Problem, wenn der Anwender den Vorgang abbricht und die alten Werte der Combobox wiederhergestellt werden sollen. Folgende Situation: 1. Es wird eine Datei mit unbekanntem Format geladen => Combobox: ItemIndex:=-1 und Text:= 'nicht gültig' 2. Anwender wählt einen Eintrag in der Combobox für die Konvertierung aus. 3. Im Event (OnChange, oder OnSelect) wird eine Abfrage ausgelöst, ob die Konvertierung wirklich gemacht werden soll. 4a. "Ja": Alles prima (Konvertierung wird durchgeführt und Combo steht auf dem richtigen Eintrag. 4b. "Nein": Die alten Werte in der Combobox müssen wiederhergestellt werden (also ItemIndex:=-1 und Text:='nicht gültig'). 4b funktioniert leider nicht. Zwar wird der Index auf -1 gesetzt und auch der Text lässt sich ändern, wird aber danach (vermutlich durch die Eventbehandlung des Objekts) noch mals mit '' überschrieben. Ich habe schon versucht das mit "abort" zu verhindern. Leider kein Erfolg. Auch alle möglichen Tips aus dem Forum zu ähnlichen Themen haben mich leider nicht weiter gebracht. Hat jemand eine Idee, oder kann mir sagen, ob es ein Event gibt, dass ausgelöst wird, wenn die Bearbeitung abgeschlossen ist (so dass nichts mehr überschrieben wird, oder wie ich die "Weiterbearbeitung" verhindern kann. Vielen Dank und viele Grüße, StTüff |
Re: Combobox ItemIndex=-1; Text ändern im Event
Zeig doch mal den Event-Handler.
|
Re: Combobox ItemIndex=-1; Text ändern im Event
Gerne:
Delphi-Quellcode:
Gruß,
procedure TForm1.CoBo_VersionChange(Sender: TObject);
begin if MessageDlg('Soll die Konvertierung durchgeführt werden?', mtConfirmation, [mbyes, mbCancel], 0)=mrYes then begin ...Konvertierung... end else begin CoBo_Version.ItemIndex :=-1; CoBo_Version.Text:='Test'; end; end; StTüff |
Re: Combobox ItemIndex=-1; Text ändern im Event
Hai StTüff,
eventuell ist ja das ![]() |
Re: Combobox ItemIndex=-1; Text ändern im Event
Hallo,
ich würde den Zustand der Daten nicht nur in der ComboBox, sondern zusätzlich in einer property der Form oder bei Bedarf auch in einer globalen Variable festhalten. Wird die Aktion ordnungsgemäß ausgeführt, dann kannst du die neue Einstellung in die Variable übertragen, andernfalls initialisierst du die ComboBox neu. Für die eigentliche Benutzeraktion gilt wie immer: Sie sollte durch eine TAction ausgeführt werden können, d.h. nur Komponenten kommen in Frage, die über die Eigenschaft Action verfügen. Ich würde einen Button oder ein MenuItem bevorzugen und eine ComboBox nur für Einstellungen verwenden. Grüße vom marabu |
Re: Combobox ItemIndex=-1; Text ändern im Event
Hallo Sharky!
Das habe ich auch schon versucht. Hilft leider nicht. Aus der PalmOS-Programmierung kenne ich so was wie "Handled=true" um die weitere Verarbeitung zu verhindern. Gibt es so was auch hier (wie gesagt: "abort" hilft auch nicht). Gruß, StTüff |
Re: Combobox ItemIndex=-1; Text ändern im Event
Hallo Marabu!
Erst mal Danke für die Antwort. Mir hilft es leider nichts, die Aktion über einen Button oder ähnliches auszulösen, da ich ja an einer Stelle das Format, in das konvertiert werden soll vorgeben muss. Wenn nun die Änderung des Comboboxinhalts (bzw. die Auswahl) keine Aktion auslösen würde, dann wäre der Inhalt nicht mehr konsisten mit dem Tatsächlichen Format. Ich könnte natürlich hergehen und nach dem Tastendruck ein weiteres Formular öffnen, bei dem die Zielversion vorzugeben ist und das Formular dann wieder schließen. Das halte ich aber für sehr umständlich und nicht gerade bedienerfreundlich. Bei der Neuanlage einer Datei ist es so realisiert und dort passt das auch ganz gut. Wenn aber das Format gewechselt werden soll, dann hätte ich das schon ganz gern durch eine einfache Auswahl in der Combobox gemacht (was ja auch funktionieren würde, wenn ich nicht die Abbruchsmöglichkeit vorsehen hätte wollen). Es muss doch eine Möglichkeit geben, wie ich die Werte (die ich natürlich so gespeichert habe, wie Du es auch vorgesschlagen hast) in der Combobox wiederherzustellen. Aus meiner Sicht sind zwei Wege denkbar: 1. Die weitere Ausführung verhindern. oder 2. Auf ein Event regieren, dass erst eintritt, wenn die objektseitigen Änderungen schon durchgeführt wurden, so dass nichts mehr überschrieben wird. Die Frage ist nur wie.... Gruß, StTüff |
Re: Combobox ItemIndex=-1; Text ändern im Event
Nimm anstatt dem OnChange das OnSelect Ereignis der CB. Dieses wird nur gefeuert, wenn der Nutzer in der Auswahlliste einen Eintrag auswählt, nicht aber, wenn durch Programmcode oder Nutzereingaben der Text des Edits verändert wird.
|
Re: Combobox ItemIndex=-1; Text ändern im Event
Hallo Stephan,
ich würde das technische Problem so lösen: Die ComboBox würde ich mit dem Style csDropDownList betreiben, bei den Items würde ich dem Item 0 den Text 'nicht gültig' zuweisen, auf die Verwendung von ItemIndex -1 würde ich verzichten.
Delphi-Quellcode:
Freundliche Grüße
procedure TDemoForm.ComboBoxChange(Sender: TObject);
begin with Sender as TComboBox do if MessageDlg('Okay?', mtConfirmation, mbOkCancel, 0) then self.ComboIndex := ItemIndex else ItemIndex := self.ComboIndex; end; end; |
Re: Combobox ItemIndex=-1; Text ändern im Event
Hallo Sidorion!
Das löst mein Problem leider nicht, da das Event ja zur richtigen Zeit ausgelöst wird. Lediglich der Text lässt sich nicht ändern. Trotzdem vielen Dank! Hallo Marabu! Daran habe ich auch schon gedacht. Dann habe ich aber das Problem, dass der Anwender das Format "nicht gültig" auswählen kann, was vielleicht auch etwas komisch ist (vor allem was mache ich, wenn der das dann auch macht...). Eine weitere mögliche Lösung ist, dass ich dann die Combobox einfach leer lasse und die Information in ein separates Label o.Ä. packe. Geht, ist aber nicht gerade die Ideallösung. Gruß, Stephan |
Re: Combobox ItemIndex=-1; Text ändern im Event
Liste der Anhänge anzeigen (Anzahl: 1)
Hai StTüff,
ich denke auch das der von Marabu genannte Ansatz der beste ist. Wenn Du eine TActionList verwendest und dort eine TAction mit einen OnExecute und einem OnUpdate Ereigniss hast ist das ganze recht einfach und für den Anwender gut zu bedienen.
Delphi-Quellcode:
procedure TDemo_Form.ac_ConvertExecute(Sender: TObject); //OnExecute einer TAction
begin ShowMessage('Ich konvertiere'); end; procedure TDemo_Form.ac_ConvertUpdate(Sender: TObject); // OnUpDate der TAction begin ac_Convert.Enabled := cb_Formate.ItemIndex > 0; end; procedure TDemo_Form.FormCreate(Sender: TObject); begin cb_Formate.Clear; cb_Formate.Style := csDropDownList; cb_Formate.Items.Add('nicht gültig'); cb_Formate.Items.Add('blubb'); cb_Formate.Items.Add('foo'); btn_Convert.Action := ac_Convert; end; |
Re: Combobox ItemIndex=-1; Text ändern im Event
Hallo!
Danke, dass Du Dir die Mühe gemacht hast. Die Lösung funktioniert natürlich, passt aber nicht ganz in das Konzept. Dies hat folgende Gründe, die natürlich auch auf Grund des bereits vorhandenen Konzepts entstanden sind: 1. Die Combobox ist synchron mit dem Format der Datei und zeigt dieses an. (Wenn eine Datei geladen wird, dann wird der entsprechende Eintrag gewählt). Wenn man die Combobox nun verstellen könnte, ohne das was passiert, dann wäre die Synchronität nicht mehr gewährleistet. 2. Wenn die Combobox als Eintrag "ungültiges Format" enthält, dann wird dies dem Anwender als Auswahl angeboten (was überhaupt keinen Sinn macht). Für mich ist die einzige Alternative (die mir aber wie schon geschrieben auch nicht sonderlich gut gefällt): - In der Combobox sind nur Einträge für gültige Formate enthalten, die der Anwender auch (sinnvoll) auswählen kann. - Wenn eine Datei mit ungültigem Format geladen wird, dann wird in der Combobox gar nichts angezeigt (Index -1) und "Ungültiges Format" wird an anderer Stelle angezeigt. - Wenn in der Combobox was gewählt wird, erfolgt nach Bestätigung die Konvertierung, oder bei Abbruch wird die Combobox auf den alten Indexwert zurückgesetzt. Die Anzeige, ob es sich um ein bekanntes (gültiges) Format handelt, erfolgt dabei an einer anderen Stelle weil der Text in der Combobox im Event nicht gesetzt werden kann (=> mein eigentliches Problem). Falls doch noch jemandem einfällt, wie ich es anstellen kann den Text der Combobox zu setzen, ohne das er dann (durch die gleichzeitige Änderung auf ItemIndex:=-1 wieder gelöscht wird) wäre ich sehr dankbar, da ich dann das bestehende Konzept nicht über den Haufen werfen müsste. Gruß, StTüff |
Re: Combobox ItemIndex=-1; Text ändern im Event
Hai StTüff,
ich glaube Du solltest lieber die Prammlogik prüfen ;-) a) Wenn eine Datei ausgwählt wurde die "nicht unterstützt wird" dann disable die ComboBox. b) Bei einer "gültigen Datei" werden in der ComboBox nur sinnvolle Eintäge erzeugt. Oder ich verstehe jetzt überhaupt nicht was Du machen möchtest. |
Re: Combobox ItemIndex=-1; Text ändern im Event
Hallo,
in der Hoffnung beim überfliegen der Beiträge nicht etwas übersehen zu haben, setz doch das Event temporär auf nil:
Delphi-Quellcode:
procedure TForm1.CoBo_VersionChange(Sender: TObject);
begin if MessageDlg('Soll die Konvertierung durchgeführt werden?', mtConfirmation, [mbyes, mbCancel], 0)=mrYes then begin ...Konvertierung... end else begin CoBo_Version.OnChange := nil; //<--- CoBo_Version.ItemIndex :=-1; CoBo_Version.Text:='Test'; CoBo_Version.OnChange := CoBo_VersionChange; //<--- end; end; |
Re: Combobox ItemIndex=-1; Text ändern im Event
Hallo Stüff,
hatte gestern zufällig ein eng verwandtes Problem: in einer Combobox wird ausgewählt, was bearbeitet werden soll, und für die Dauer der Bearbeitung wollte ich die Combobox disablen und nur die Nummer der bearbeiteten Station anzeigen lassen. Das geht, wenn es durch einen Button ausgelöst wird, aber nicht im Eventhandler für das Select-Event - da ist die Behandlung nicht abgeschlossen und der Text wird nach dem Ende des Select-Event-Handlers nochmal überschrieben von der Komponenten-Software. So in etwa habt ihr das ja auch rausgefunden. Ich habe eine andere Möglichkeit gefunden, da bei mir das richtige drin stand, aber verschwand - jetzt mache ich garnichts mehr als disablen, dann steht das richtige drin und kann nicht mehr geändert werden. Diese Lösung ist für dein Problem nicht brauchbar, aber vielleicht funktioniert es, wenn du mit Postmessage eine WM_TEXT-Message an die Combobox schickst - die sollte eigentlich erst bearbeitet werden, wenn der Eventhandler fertig ist. Gruss Reinhard |
Re: Combobox ItemIndex=-1; Text ändern im Event
Hallo zusammen!
erst mal vielen Dank für die Antworten! @Sharky: Ich glaube, ich habe die Funktion der Combobox nicht so ganz richtig rüber gebracht: Für die Combobox wird beim Programmstart für jedes bekannte Format (ist erweiterbar, ohne das Programm zu ändern) ein Eintrag erzeugt ("nicht unterstützt" ist da natürlich nicht dabei). Damit können dann Dateien in jedem bekannten Foramt erzeugt werden. Wird eine bereits vorhandene Datei geladen, so wird der entsprechende Eintrag angewählt. Wird eine Datei geladen für die es keine passende Formatbeschreibung gibt (es befindet sich also kein passender Eintrag in der Combobox), so kann auch kein Eintag in der Combobox gewählt werden und es wird der Index -1 gesetzt und der Text in "kein gültiges Format" geändert. Der Anwender kann jederzeit (auch wenn das Format unbekannt ist) durch Auswahl eines anderen Eintrags in der Combobox eine Formatkonvertierung auslösen und so die Dateien beliebig (sehr einfach) in andere Formate konvertieren. Bei der Auswahl soll dem Anwender natürlich ("nicht unterstützt" bzw. "ungültiges Format") nicht angeboten werden. Das alles funktioniert damit einwandfrei und bis jetzt kam auch jeder Anwender damit sehr gut zurecht. Inzwischen gibt es aber sehr aufwendige Konvertierungen, die einige Sekunden dauern. Daher war ein Anwenderwunsch, dass man nach der Formatauswahl noch eine Möglichkeit haben soll, um zu entscheiden, ob man die Konvertierung wirklich durchführen möchte. Zunächst dachte ich: Kein Problem (ist es ja eigentlich auch nicht), bis ich auf das Problem mit dem Text gestoßen bin. Natürlich könnte ich jetzt alles anders machen. Ich wollte aber eigentlich nicht so viel an der Bedienung ändern. Vielleicht erklärt dass jetzt, warum ich a) nicht disablen kann (somit könnte die Datei nicht in ein gültiges Fromat überführt werden (was eignetlich möglich ist)) und b) die Einträge nicht beim Laden der Datei sondern beim Programmstart generiert werden und für alle Dateien sinnvoll sind. @Lannes: Mein Problem ist nicht, dass das Event durch die Änderung erneut ausgelöst wird, sondern, dass nach meiner Änderung der Text noch mal (aber nicht durch ein neues Event) überschrieben wird (so wie Reinhard das beschreibt). Trotzdem vielen Dank! @Reinhard: Genau das ist mein Problem. Und die Idee mit der Windowsmassege könnte die Lösung sein. Versuche ich gleich mal. Ich hatte in meiner "Not" auch schon so blöde ideen mit Timer usw. was aber nicht zuverlässig funktionieren würde. Ich könnte die Box auch überwachen und immer, wenn der Index auf -1 steht den Text eintragen. Ist aber alles nicht sauber. Dein Ansatz gefällt mir gut. Werde ich testen.... :thumb: Viele Grüße, StTüff |
Re: Combobox ItemIndex=-1; Text ändern im Event
Das einfachste ist das Event "abzuschalten" wenn man nicht will das es ausgelöst wird
Delphi-Quellcode:
var
lOnChange: TNotifyEvent; begin lOnChange := Combobox.OnChange; Combobox.OnChange := nil; //Do Anything Combobox.OnChange := lOnChange; |
Re: Combobox ItemIndex=-1; Text ändern im Event
..wie schon gesagt: Das Problem ist nicht dass das Event (mehrfach) ausgelöst wird, sondern, dass die Komponentenlogik noch mal den Text auf '' setzt, obwohl er im Eventhandler auf 'blabla' gesetzt wurde (siehe Beschreibung von Reinhard). Das Event wird nur genau ein mal ausgelöst (mehrfach getestet).
Gruß, StTüff |
Re: Combobox ItemIndex=-1; Text ändern im Event
Hallo Reinhard!
Habe folgenden Versuch unternommen:
Delphi-Quellcode:
Leider funktioniert es nicht (zumindest nicht zuverlässig).
procedure TForm1.CoBo_VersionCloseUp(Sender: TObject);
const MAXBUF = 255; var buf: array[0..MAXBUF] of Char; begin if MessageDlg('Konvertierung durchführen?' mtConfirmation, [mbyes, mbCancel], 0)=mrYes then begin .... Konvertierung .... end else begin CoBo_Version.ItemIndex :=-1; //CoBo_Version.Text:='Test'; buf:='test'+char(0); SendMessage(CoBo_Version.Handle, WM_SETTEXT, MAXBUF, Integer(@Buf)); end; end; Schade :( Gruß, StTüff |
Re: Combobox ItemIndex=-1; Text ändern im Event
ich hab eine Lösung:
Delphi-Quellcode:
procedure ResetCMB(var AMsg: TMessage); message wm_user + 1;
[...] procedure TForm1.ResetCMB(var AMsg: TMessage); begin ComboBox1.ItemIndex := -1; ComboBox1.Text := 'nicht gültig'; end; procedure TForm1.ComboBox1Change(Sender: TObject); begin if MessageBox(Self.Handle, 'Konvertierung durchführen?', 'Frage', MB_YESNO or MB_ICONQUESTION) <> IDYES then begin PostMessage(Self.Handle, WM_USER + 1, 0, 0); end; end; |
Re: Combobox ItemIndex=-1; Text ändern im Event
Hallo!
Ich habe mal ein kleines Testprojekt erstellt, dass die Problematik zeigen soll (anbei). Es gibt eine Combobox bei der zwischen den Einträgen gewechselt werden kann (mit einer Dialogbox wird abgefragt, ob der Wechsel erfolgen soll, oder abgebrochen werden soll). Dabei wird immer der letzte Index gemerkt, so dass der Vorgang abgebrochen und auf den letzten Index zurückgesprungen werden kann. Dies funktioniert für alle Einträge, nicht aber, wenn die Combobox auf dem Index -1 steht (ist beim Programmstart so und kann mit dem Button wiederhergestellt werden). Dabei wird der Text nicht gesetzt. Damit der Anwender die Anzeige 'ungültig' nicht als Auswahl bekommt wurde das so gemacht (soll nur eine Info sein, die Programmgesteuert gesetzt werden kann; siehe auch Beschreibungen zuvor). Wer Lust hat kann mal damit spielen. Bin gespannt, ob einer eine saubere Lösung für das Problem findet. Ich bin inzwischen soweit, dass ich beinahe schon aufgebe... aber der Ehrgeiz... ich wills wissen :wall: Gruß und viel Spaß beim tüfteln (das ist ja fast schon ein Wettbewerb :wink: ). StTüff PS: Gerade habe ich die Lösung von SirThornberry gesehen. Werde ich gleich mal testen.... => Habe den Anhang wieder gelöscht, da weiter unten das Beispiel mit Lösung zu finden ist. |
Re: Combobox ItemIndex=-1; Text ändern im Event
Liste der Anhänge anzeigen (Anzahl: 1)
:dancer: Jawohl... Die Lösung von SirThornberry funktioniert. Er hat damit den Wettbewerb gewonnen! :cheers:
Anbei noch mal die komplette Lösung als Beispiel. Gruß und vielen Dank für die Beteiligung (und natürlich die Lösung), StTüff |
Re: Combobox ItemIndex=-1; Text ändern im Event
Zitat:
kann es auch garnicht: Sendmessage wartet ja, bis die Message verarbeitet ist. Deswegen habe ich ja geschrieben "mit PostMessage". Sind oft so die Kleinigkeiten. Gruss Reinhard |
Re: Combobox ItemIndex=-1; Text ändern im Event
und bei PostMessage muss man aufpassen das der Buffer keine lokale Variable ist und nur auf dem Stack liegt.
|
Re: Combobox ItemIndex=-1; Text ändern im Event
Genau :roll:
Aber sonst wäre das leben ja auch zu lanweilig.... Selbstverständlich geht die hälfte des Ruhmes an Dich. SirThornberry war ja quasi nur der Abstauber. Aber auch die "Verwandlung" zählt, nicht (nur) die Torchance.... Gruß und schönen Tag, StTüff |
Re: Combobox ItemIndex=-1; Text ändern im Event
der Ausschlag gebende Punkt bei der Lösung ist, das die Rückänderung nicht im OnChange erfolgt sondern danach. Und das kann man über einen Timer oder über PostMessage erreichen sofern keine weiteren Messages der Messagequeue im OnChange abgearbeitet werden.
|
Re: Combobox ItemIndex=-1; Text ändern im Event
Die Überlegung mit dem Timer hatte ich ja weiter oben auch schon mal angestellt. Dabei war ich mir aber nicht sicher, ob es eine Überschneidung geben kann, wenn der Timer abläuft, solange das Event (aus welchem Grund auch immer) noch nicht abgelaufen ist.
Ich glaube aber zu wissen, dass das Timerevent (bzw. die zugehörige Nachricht) in der Messageque dann hinten ansteht. Sicher war und bin ich mir da aber nicht, dehalb habe ich es gelassen. Die Lösung, wie sie jetzt ist finde ich sehr gut und bin froh, dass es ein solches Forum mit kompetenten Teilnehmern gibt. Gruß, StTüff |
Re: Combobox ItemIndex=-1; Text ändern im Event
Die Timermessage würde dann hinten in der Messagequeue angestellt werden. Allerding hättest du bei hängen des Programmes den Nachteil das mehrere Timermessages anstehen und somit nach dem abschalten des Timers im OnTimer trotzdem noch weitere male das OnTimer-Event ausgeführt werden könnte.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 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 by Thomas Breitkreuz