Events vermeiden / wxGRID

Plattformunabhängige GUIs mit wxWidgets.
Antworten
leberwurstpizza
User
Beiträge: 4
Registriert: Mittwoch 11. April 2007, 12:16

Mittwoch 11. April 2007, 12:25

Hallo Forum,
erstmal super das es sowas gibt. Ich bin häufig hier als Gast und lese eure Beiträge und fummel mir was daraus zurecht. Ich kann zwar kein Python aber programmiere Wx mit Perl. Leider sieht es mit Foren und Doku zu wxPerl sehr schlecht aus. Darum frage ich mal hier.

Ich habe folgendes Problem :

Ich fange mit EVT_GRID_CELL_CHANGE ob sich ein Wert in einem wxGrid geändert hat. Danach muss ich aber alle Spalten automatisch in der Grösse anpassen mit AutoSizeColumns und den GridCursor auf eine bestimmte Position setzen.

Da AutoSizeColumns und SetGridCursor in dem EVT_GRID_CELL_CHANGE aufgerufen werden führt das natürlich zu einem endlosen Aufruf des Events ( da AutoSizeColumns und SetGridCursor ) ebenfalls das Event auslösen. ( Es gibt keine Möglichkeit das danach abzufangen, da das Programm dann wieder im MainLoop ist )

Habt ihr Ideen wie ich obiges umsetzen kann ? Z.b jedes weitere Event vermeiden o.Ä.

Ihr könnt das auch gerne in Python ausdrücken - das kapier ich dann schon.


Vielen Dank,
für Tips und Anregungen.
Grüsse leberwurstpizza
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 11. April 2007, 12:37

leberwurstpizza hat geschrieben:Ich fange mit EVT_GRID_CELL_CHANGE ob sich ein Wert in einem wxGrid geändert hat.
[...]
Da AutoSizeColumns und SetGridCursor in dem EVT_GRID_CELL_CHANGE aufgerufen werden führt das natürlich zu einem endlosen Aufruf des Events ( da AutoSizeColumns und SetGridCursor ) ebenfalls das Event auslösen.
Hallo leberwurstpizza!

Vielleicht kannst du statt EVT_GRID_CELL_CHANGE EVT_GRID_EDITOR_HIDDEN verwenden. Damit weißt du zwar nicht, ob sich etwas geändert hat, aber es wird *nicht* automatisch nach einem AutoSizeColumns aufgerufen.

Ansonsten musst du dir an globaler Stelle eine Variable setzen. Diese prüfst du im EVT_GRID_CELL_CHANGE-Handler ab. Wenn diese gesetzt ist, dann beendest du den Handler ohne etwas zu tun. Wenn diese Variable nicht gesetzt ist, dann setzt du diese Variable auf True, arbeitest alles durch und zum Schluß setzt du die Variable wieder zurück. So wird nur auf das erste EVT_GRID_CELL_CHANGE reagiert. Die weiteren EVT_GRID_CELL_CHANGE-Events werden ignoriert, bis der Handler mit seiner Arbeit fertig ist.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
leberwurstpizza
User
Beiträge: 4
Registriert: Mittwoch 11. April 2007, 12:16

Mittwoch 11. April 2007, 13:24

Hallo Gerold,
vielen Dank ... das hat mich schon ein ganzes Stück weiter gebracht.

Ich hatte es so ähnlich vorher, indem ich die X,Y Koordinaten ermittelt habe und dann geprüft habe, ob es sich um die gleichen handelt. Ist natürlich nur mittelmässig gut, weil wenn das gleiche Feld 2 mal bearbeitet wird klappt es nicht mehr ... Mit deiner Idee klappt es einwandfrei.

Jetzt fehlt mir nur noch eine Möglichkeit den GridCursor zu setzen, denn am Ende des EVT_GRID_CELL_CHANGE setzt er den Cursor immer unter die Zeile die gerade bestätigt wurde ( mit Enter ). Man kann auch TAB nehmen, aber der Kunde will mit Enter bestätigen ... oO ...

Vielleicht kann ich den KeyCode abfangen und dann Enter durch Tab ersetzen. Mal sehen.

Vielen Dank auf jedenfall,
Gruss leberwurstpizza
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Mittwoch 11. April 2007, 15:05

leberwurstpizza hat geschrieben:Jetzt fehlt mir nur noch eine Möglichkeit den GridCursor zu setzen, denn am Ende des EVT_GRID_CELL_CHANGE setzt er den Cursor immer unter die Zeile die gerade bestätigt wurde ( mit Enter ). Man kann auch TAB nehmen, aber der Kunde will mit Enter bestätigen ... oO ...
So ein Problem hatte ich auch schon mal. Ich habe damals nicht mehr weiter mit beschaeftigt, da es erstmal wichtigere Dinge gab. Aber wenn dir dazu was einfaellt, waere es super, wenn du es hier posten koenntest. :)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 12. April 2007, 08:40

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
leberwurstpizza
User
Beiträge: 4
Registriert: Mittwoch 11. April 2007, 12:16

Donnerstag 12. April 2007, 14:13

Hi,
@Gerold
Vielen Dank,
da sieht man mal was alles so in einem EVT_GRID_CELL_CHANGE abgeht ;)


@Rebecca
Zu unserem ähnlichen Problem hab ich folgendes gefunden :
http://lists.wxwidgets.org/archive/wxPy ... 07738.html

Habs noch nicht probiert. Aber das beschreibt das Problem und bietet alternativ 2 lösungswege.

Gruss leberwurstpizza
leberwurstpizza
User
Beiträge: 4
Registriert: Mittwoch 11. April 2007, 12:16

Donnerstag 12. April 2007, 14:30

@Rebecca

Ich hab unser Problem gelöst ;)

In etwa so : ( perlmässig )

Code: Alles auswählen

 EVT_KEY_DOWN($self->{excel},sub 
        { 
                my($self,$event)=@_;

                my $code=$event->GetKeyCode;

                if($code==13) # WXRETURN OR SOMETHING
                {
                   $self->MoveCursorRight(0);

                }
                else
                { $event->Skip; }

        });
Du musst also nur das KeyEvent des Grids abfangen und dann im Falle der Entertaste die entsprechende Aktion zuweisen. Ich denke mal das er danach EVT_GRID_CELL_CHANGE AUFRUFT, was dann mit Enter beendet wird und dann erneut durch EVT_KEY_DOWN den Cursor in meinem Fall nach rechts bewegt.

Für dein Problem brauchst du dann nur MoveCursorUp nutzen.

Viel Spass damit,
Sorry das ich es nicht in Python ausdrücken kann,
Gruss leberwurstpizza
Antworten