SetFocus Problem

Rund um die LCL und andere Komponenten
Antworten
piper62
Beiträge: 131
Registriert: Sa 5. Apr 2008, 17:57
OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
CPU-Target: 32Bit/64Bit
Wohnort: Ulm

SetFocus Problem

Beitrag von piper62 »

Hallo zusammen,

ich habe ein sehr nerviges Focusproblem. In einer Anwendung gibt es ein StringGridund ein Memo. Das Memo dient als Editor zum Beispiel für die Spalte Nr. 2.
Wenn nun das Editieren im StringGrid das erste Mal angeschaltet wird und das erste mal in die Spalte gewechselt wird in dem das Memo die Funktion als Editor übernimmt, dann kommt der Focus NICHT in den Editor.
Ein Mausclick in den Editor und der Focus sitzt korrekt. Bei einem erneuten Aktivieren des Memo Feldes sitzt der Focus gleich richtig.
Ich kann auch versuchen mit Memo1.SetFocus den Focus zu setzen, beim ersten Aufruf geht es nicht.

Das ist sehr nervend weil die Anwender das StringGrid mit der Tastatur bedienen wollen und der Griff bei ersten Aufruf zur Maus als störend empfunden wird.
Das muss ja auch gehen!?! Oder?!

Ich hänge ein gezipptes Projekt an in dem Ihr das Ganze nachvollziehen könnt.

Meine Plattform ist Linux, Lazarus 0.9.28.1, FPC 2.2 wobei ich es unter 09.29 mit FPC 2.4 getestet habe. => gleicher Effekt!

Für Hinweise wäre ich dankbar.
Dateianhänge
focus_test01.zip
(290.17 KiB) 74-mal heruntergeladen

u-boot
Beiträge: 306
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: SetFocus Problem

Beitrag von u-boot »

Entweder bei mir tritt das Problem nicht auf oder ich habe die Problembeschreibung nicht verstanden. Hier Ubuntu 9.10 lazarus svn momentan Revision 29147 - FPC 2.4.2 | Widgetset: Gtk2
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

u-boot
Beiträge: 306
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: SetFocus Problem

Beitrag von u-boot »

Ahja das Visible bitte vors Boundsrect sonst ist das Memofeld so Verkrüppelt. Ich hab dann das Visible zur Designtime auf false gesetzt und funktioniert alles wunderbar soweit ich das sehe.
Dateianhänge
focus_test02.zip
Hier mal das was bei mir dann rausgekommen ist
(1.97 MiB) 66-mal heruntergeladen
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

piper62
Beiträge: 131
Registriert: Sa 5. Apr 2008, 17:57
OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
CPU-Target: 32Bit/64Bit
Wohnort: Ulm

Re: SetFocus Problem

Beitrag von piper62 »

das ist merkwürdig. Bei mir bleibt es bei dem Problem.
Nur nach dem ersten Aufruf des Memo kommt der Cursor nicht in das Memofeld. Ich muss einmal da rein klicken.
Ab dem zweiten Aufruf ist der Cursor dann drin.

Das ändert sich mit Deiner Variante nicht.

u-boot
Beiträge: 306
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: SetFocus Problem

Beitrag von u-boot »

Lag dann wohl doch am Problemverständnis. Alternativ zur Maus kann man auch per Tastatur nochmal auf ein anderes Feld steuern und dann zurück aber beim ersten mal ist der Focus falsch.
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

u-boot
Beiträge: 306
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: SetFocus Problem

Beitrag von u-boot »

Als Workaround funktioniert aber folgendes:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  StringGrid1.Editor:=Memo1;
end;
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

u-boot
Beiträge: 306
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: SetFocus Problem

Beitrag von u-boot »

Auch wenn da was doppelt ist, was so eigentlich nicht hingehört als workaround gehts auch so:

Code: Alles auswählen

procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer;
  var Editor: TWinControl);
begin
  if (aCol=2) and (aRow>0) then
  begin
    Memo1.Visible:=True;
    StringGrid1.Editor:=Memo1;
    Editor:=Memo1;
    Memo1.BoundsRect:=StringGrid1.CellRect(2,aRow);
    Editor.SetFocus;
  end;
end;
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

piper62
Beiträge: 131
Registriert: Sa 5. Apr 2008, 17:57
OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
CPU-Target: 32Bit/64Bit
Wohnort: Ulm

Re: SetFocus Problem

Beitrag von piper62 »

Super! Danke !!!
Ich muss ehrlich gestehen ich wäre nicht auf die Idee gekommen das doppelt gemoppelt zu machen :-)

So oder so werde ich wohl einen Bugreport absetzen. Das Verhalten ist definitiv nicht OK.

Gruß,
Piper

u-boot
Beiträge: 306
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

nachgesehn:

Beitrag von u-boot »

Ich hab das ganze mal nachgesehn. Evtl. hilfts jemand der in der Lage ist einen Patch dafür zu schreiben. Ich habe gerade keine Idee wie das gehen soll. Das Problem ist in der Konstellation ein Parent-Wechsel nach dem Setfocus.

following code was tried in Stringgrid1.OnSelectEditor:

Code: Alles auswählen

procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer;
  var Editor: TWinControl);
begin
  if (aCol=2) and (aRow>0) then
  begin
    Memo1.Visible:=True;
    Editor:=Memo1;
    Memo1.BoundsRect:=StringGrid1.CellRect(2,aRow);
    Editor.SetFocus;       //!!! here is the focus that doesn't work
  end;
end;


//looking up the selecteditor-proceure:

Code: Alles auswählen

procedure TCustomGrid.SelectEditor;
var
  aEditor: TWinControl;
begin
  aEditor := GetDefaultEditor(Col);
  if EditingAllowed(FCol) and Assigned(OnSelectEditor) then begin
    // in some situations there are only non-selectable cells
    // if goAlwaysShowEditor is on set initially editor to nil,
    // user can modify this value in OnSelectEditor if needed
    if not SelectCell(FCol,FRow) then
      aEditor:=nil;
    OnSelectEditor(Self, fCol, FRow, aEditor);    //!! here the above procedure with the setfocus is called
  end;
  if aEditor<>Editor then
     Editor := aEditor;       //!! here SetEditor is called that contains changing Parent with impact on focus
end;
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Antworten