Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TStringGrid und PopUp in Firemonkey (https://www.delphipraxis.net/175601-tstringgrid-und-popup-firemonkey.html)

Photoner 3. Jul 2013 13:56

TStringGrid und PopUp in Firemonkey
 
Hallo liebe DPler,

Vielleicht habt ihr einen guten Tip für mich. Ich habe folgendes Problem:

Wenn mit Hilfe des Standard PopUp Fensters (Auschneiden, Kopieren...) eine Zelle in einem TStringGrid bearbeitet wird, dann wird das Ereignis TStringGrid.OnEditingDone nicht aufgerufen und somit ist die Änderung der Zelle nicht fix. Einmal scrollen oder andere Zelle anwählen und die gerade bearbeitete Zelle ist wieder in ihrer ursrpünglichen Form vorhanden, da oberflächlich nur das Edit Feld verändert wird.
Das ist ziemlich ärgerlich...

Was ich suche ist eine Möglichkeit auf die Message WM_EXITMENULOOP zu reagieren und damit OnEditingDone zu triggern. Alternativ würde es mir auch helfen zu wissen, wie ich verhindern kann, dass das Popup Fenster überhaupt erscheint. Kann auch darauf verzichten. Für die VCL findet man auch einige Tips, aber unter Firemonkey leider nicht. Was ich noch erwähnen sollte: Die Anwendung schreibe ich in Delphi XE2 für Windows.

Grüße!

stahli 3. Jul 2013 16:14

AW: TStringGrid und PopUp in Firemonkey
 
Als Workaround könntest Du vielleicht auf OnEnter des Grids reagieren. Ich gehe davon aus, dass es den Fokus erhält wenn das Popup geschlossen wird.

Ansonsten vielleicht mal einen QC-Eintrag schreiben (bringt vermutlich nicht viel aber beruhigt das Gewissen ;-()

RWarnecke 3. Jul 2013 19:42

AW: TStringGrid und PopUp in Firemonkey
 
Hallo,

vielleicht ist dieser Link etwas für Dich.

Photoner 4. Jul 2013 09:10

AW: TStringGrid und PopUp in Firemonkey
 
Zitat:

Zitat von RWarnecke (Beitrag 1220659)
Hallo,

vielleicht ist dieser Link etwas für Dich.


Der Link ist hilfreich!

Der springende Punkt ist, das OnChange Ereignis weiterzureichen und ein paar Feinheiten zu beachten. Ich habs wie folgt zum Laufen gebracht:

Diese Zeilen im FormCreate o.ä.:
Delphi-Quellcode:
      for I := 0 to StringGrid1.ColumnCount-1 do begin
        StringGrid1.ColumnByIndex(i).ApplyImmediately := false;
Verhindert das sofortige ändern des Grids wenn Eingaben erfolgen. Hat den Vorteil, dass das OnChange beim verlassen des Edits getriggert wird (wird gebraucht).
Auch noch in FormCreate eine Prozedur:

Delphi-Quellcode:
procedure TTestForm.UpdateStringGrid;
var
CellCtrl : TStyledControl;
Col,Row  : Integer;
begin
  for col := 0 to StringGrid1.ColumnCount-1 do begin
    for row := 0 to StringGrid1.RowCount-1 do begin
      CellCtrl := StringGrid1.ColumnByIndex(col).CellControlByRow(row);
      if ( CellCtrl <> nil ) and ( CellCtrl is TTextCell ) then begin
        TTextCell( CellCtrl ).OnApplyStyleLookup := GridCellApplyStyleLookup;
        TTextCell( CellCtrl ).UpdateStyle;
        TTextCell( CellCtrl ).OnChange := CellChange;
      end;
    end;
  end;
end;
Damit kann man (auch zur Laufzeit) den Style der Zellen ändern. Hier ist aber wichtig das OnChange zu fangen.

Delphi-Quellcode:
procedure TTestForm.CellChange(Sender : TObject);
begin
  TColumn(TFMXObject(Sender).Parent).EndUpdate;
end;
Was genau bei EndUpdate von TColumn alles geschieht kann vielleicht jemand mit mehr Programmiererfahrung erzählen. Ich kann bloß sagen, dass auch Änderungen im Edit einer Zelle hiermit übernommen werden.
Kopieren, Ausschneiden, etc. wird damit auch übernommen.

Falls dieser Workaround Schwierigkeiten an anderer Stelle verursacht werde ich das hier erwähnen. Ansonsten gelöst.

Nachtrag:
Der Workaround funktioniert doch nicht. Keine Ahnung warum das einmal geklappt hat und jetzt nicht mehr...

Danke für euer Feedback!:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:28 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