AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Combobox ItemIndex=-1; Text ändern im Event

Ein Thema von StTüff · begonnen am 20. Jul 2007 · letzter Beitrag vom 23. Jul 2007
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Combobox ItemIndex=-1; Text ändern im Event

  Alt 20. Jul 2007, 10:51
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;
Angehängte Dateien
Dateityp: zip demoform_201.zip (7,7 KB, 4x aufgerufen)
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#12

Re: Combobox ItemIndex=-1; Text ändern im Event

  Alt 20. Jul 2007, 12:36
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Combobox ItemIndex=-1; Text ändern im Event

  Alt 20. Jul 2007, 19:50
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#14

Re: Combobox ItemIndex=-1; Text ändern im Event

  Alt 21. Jul 2007, 00:26
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;
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#15

Re: Combobox ItemIndex=-1; Text ändern im Event

  Alt 21. Jul 2007, 02:06
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
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#16

Re: Combobox ItemIndex=-1; Text ändern im Event

  Alt 23. Jul 2007, 08:06
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....

Viele Grüße,

StTüff
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Combobox ItemIndex=-1; Text ändern im Event

  Alt 23. Jul 2007, 08:16
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#18

Re: Combobox ItemIndex=-1; Text ändern im Event

  Alt 23. Jul 2007, 08:22
..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
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#19

Re: Combobox ItemIndex=-1; Text ändern im Event

  Alt 23. Jul 2007, 08:29
Hallo Reinhard!

Habe folgenden Versuch unternommen:

Delphi-Quellcode:
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;
Leider funktioniert es nicht (zumindest nicht zuverlässig).
Schade

Gruß,

StTüff
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#20

Re: Combobox ItemIndex=-1; Text ändern im Event

  Alt 23. Jul 2007, 09:09
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz