Unterschiedliches Verhalten - Windows und Linux

Rund um die LCL und andere Komponenten
hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Unterschiedliches Verhalten - Windows und Linux

Beitrag von hubblec4 »

Ich hätte da mal ein paar Fragen zu gewissen "Verhalten von Komponenten" unter Linux.

Es beginnt damit, dass ich eine ComboBoxEx unter Windows mit dem Ergeinis onMouseDown programmiert habe. In dem Ergeinis soll auf einen Rechtsklick anderes reagiert werden(und auch links klick, aber mit einer anderen Aufgabe). Unter Windows funktioniert das alles so wie es soll,
aber unter Linux wird dieses Ereignis überhaupt nicht aufgerufen.
Weiterhin wollte ich das die Popupliste von der ComboBoxEx sich automatisch öffnet wenn sie geschlossen wird (also so das sie immer offen bleibt).
Unter Windows funktioniert es fast so wie ich will, aber unter Linux hängt sich das irgendwie in einer schleife fest.
Die Popupliste wird geschlossen, geöffnet, wieder geschlossen ...usw(man kann aber auf die ConboBoxEx klicken und diese Schleife damit unterbrechen,
also kein echter Absturz)

Dann wollte ich mittels Drag und Drop(Datei von der Festplatte) auf ein LabelEdit(LaE) spezielle Prozeduren aufrufen und am Ende wird ein Text ins LaE geschrieben. Windows wieder kein problem.
Aber bei Linux wird anscheinend alles eingetragen (denn beim debuggen laufen alle meine programmierten Sachen ordentlich durch, LaE Text stimmt auch),
allerdings (immer weiter debbugen mit F7 um an tiefere Proceduren zu kommen) wird dann in einer Unit in einer Procedure ein Fehler angezeigt und am Ende des debuggens steht im LaE der eigentlich Text(manchmal vollständig, manchmal fehlt ein Teil) + der komplette Datei Pfad.
Mache ich den Drop auf ein SpeedButton funktioniert das aber alles.

Wieso reagieren die Komponenten soo unterschiedlich?
Ich dachte immer das durch Lazarus das alles mehr oder weniger gleich überall funktionieren sollte.
Dateianhänge
Linux LaE.Text DragDrop.JPG
Linux LaE.Text DragDrop.JPG (11.15 KiB) 2086 mal betrachtet
Linux LaE DragDrop.JPG

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von Michl »

Wenn derartige Probleme auftreten, ist es mMn das beste, man schreibt je Problem ein kleines minimiertes Testprojekt. Dieses könnte man jeweils hier hochladen und von anderen Forumsteilnehmern gegenchecken lassen. Ist es tatsächlich so, daß es ein Fehler in der Lazarus Component Library (LCL) ist und kein Widgetset-Problem, dann sollte man einen Eintrag im Bugtracker machen: http://bugs.freepascal.org/main_page.php. Nur bekannte und gemeldete Fehler können gefixt werden.

hubblec4 hat geschrieben:Wieso reagieren die Komponenten soo unterschiedlich?
Ich dachte immer das durch Lazarus das alles mehr oder weniger gleich überall funktionieren sollte.
Ja, das ist der Vater des Gedankens. Wenn man keine wilden Verbiegungen machtI, sollten Projekte auf jedem von Lazarus unterstützten OS gleich reagieren. Leider gibt es Unterschiede auf den verschiedenen Platformen, für die Lazarus nichts kann, da bestimmte Ereignisse/Abläufe einfach nicht vom OS bereitgestellt werden. Trotzdem ist Lazarus ganz weit vorn bei der platformübergreifenden nativen Anwendungsentwicklung und wie geschrieben, noch weiter vorwärts kann man es bringen, wenn man es, wie zuvor erwähnt unterstützt.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von wp_xyz »

hubblec4 hat geschrieben:Es beginnt damit, dass ich eine ComboBoxEx unter Windows mit dem Ergeinis onMouseDown programmiert habe. In dem Ergeinis soll auf einen Rechtsklick anderes reagiert werden(und auch links klick, aber mit einer anderen Aufgabe). Unter Windows funktioniert das alles so wie es soll, aber unter Linux wird dieses Ereignis überhaupt nicht aufgerufen.

Also das klingt schwer nach einem Fehler deinerseits, denn ich kann mir nicht vorstellen, dass eine Combobox unter Linux auf keinen Links- bzw. Rechtsklick reagiert. Was ist der Vorfahre deiner ComboboxEx? Überschreibst du, um das geänderte Verhalten einzubauen, geerbte Routinen? Hast du evtl das "override" vergessen? Es gibt 1000 Gründe... Wie Michl schon gesagt hat, kann man erst mehr sagen, wenn du die neue Komponente hier postest (zusammen mit einem kleinen Testprogramm).

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von hubblec4 »

@ Michl
Ich würde wirklich gerne mehr für Lazarus tun wollen, wie ben solche Fehler finden, reproduzierbar machen, vorstellen und auf einen Fix hoffen.
Leider ist meine Zeit momentan sehr beschränkt. Wird auch sicher noch 2 Jahre so bleiben.

Ich hoffte mit meinem Post jemanden zu erreichen der da vielleicht auch sowas erlebt hat. Da ich noch sehr neu auf dem Gebiet Linux bin, mag es sicher auch an mir liegen.

Ich werde versuchen bei weiteren/oder noch für dieses Problem, mehr Infos bereit zu stellen.

@ wp_xyz

Es geht NICHT um eine ComboBox, sondern um eine "ComboBoEx", welche auch KEIN eigenes Produkt meinerseits ist, sondern in Lazarus unter dem Reiter
"Misc" zu finden ist.

Ein kleines Test programm ist vll auch schnell selbst erstellt.
Lazarus öffnen -> neues Programm -> eine ComboBoxEx auf die Form ziehen -> Im OI unter Ereignisse -> onMouseDown doppelklicken.
Im Quellcode dann folgendes einfügen

Code: Alles auswählen

if Button = mbRight then Showmessage('Rechts Klick')
else
if Button = mbLeft then Showmessage('Links Klick');


LG
hubble

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von Michl »

hubblec4 hat geschrieben:Ich würde wirklich gerne mehr für Lazarus tun wollen, wie ben solche Fehler finden, reproduzierbar machen, vorstellen und auf einen Fix hoffen.
Leider ist meine Zeit momentan sehr beschränkt.
FreePascal/Lazarus ist für uns von uns und wessen Zeit ist nicht beschränkt?!

Zumeist handhabe ich es so, daß wenn ich eine Ungereimtheit finde, ein kleines Testprojekt schreibe, das möglichst nur diese Ungereimtheit darstellt. In vielleicht 90% aller Fälle finde ich dann schon den Fehler (PS: bevor ich überhaupt was neues programmiere, mach ich diverse Proof of Concepts, sodaß ich nun mitlerweile hunderte kleine Projekte habe, wo ich immer sofort nachsehen kann, wie was funktioniert).
Wenn das fehlerhafte Verhalten immer noch auftritt, dann kann ich das kleine Projekt hier gegenchecken lassen.

Die Erstellung kleiner Testprojekte ist mMn keinesfalls verlorene Zeit, im Gegenteil, es ist für mich ein super Nachschlagewerk wovon ich jetzt profitiere. Die Gefahr, daß ich mich bei einem Projekt verrenne (das ist verlorene Zeit), ist damit eindeutig minimiert.

2.PS: Ich habe mir mal den Thread markiert. Falls sich niemand anderes zu den Punkten äußert, kann ich später mal die angesprochenen Punkte gegenchecken (wird aber dauern). Ein Thread je Fehler/Ungereimtheit/Frage würde ich mir für die Zukunft wünschen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von Michl »

hubblec4 hat geschrieben:Es beginnt damit, dass ich eine ComboBoxEx unter Windows mit dem Ergeinis onMouseDown programmiert habe. In dem Ergeinis soll auf einen Rechtsklick anderes reagiert werden(und auch links klick, aber mit einer anderen Aufgabe). Unter Windows funktioniert das alles so wie es soll,
aber unter Linux wird dieses Ereignis überhaupt nicht aufgerufen.
Kann ich bestätigen. Habe dazu einen Bugreport aufgemacht: http://bugs.freepascal.org/view.php?id=30873

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von Michl »

hubblec4 hat geschrieben:Weiterhin wollte ich das die Popupliste von der ComboBoxEx sich automatisch öffnet wenn sie geschlossen wird (also so das sie immer offen bleibt).
Unter Windows funktioniert es fast so wie ich will, aber unter Linux hängt sich das irgendwie in einer schleife fest.
Die Popupliste wird geschlossen, geöffnet, wieder geschlossen ...usw(man kann aber auf die ConboBoxEx klicken und diese Schleife damit unterbrechen,
also kein echter Absturz)
Dafür ist eine ComboBox nicht vorgesehen. Wundert mich nicht, daß das je OS (evtl. sogar je Windowsversion) unterschiedlich reagiert. Die Popupliste wird nativ, also per OS API gesteuert. Eine OwnerDraw ComboBox könnte möglicherweise auf allen Systemen gleich reagieren.
Wenn man alle möglichen Selektionsmöglichkeiten jederzeit sehen soll, würde ich eine TListBox, TListView, TStringGrid oder sonstige mehrzeilige Komponente verwenden.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von wp_xyz »

hubblec4 hat geschrieben:Es geht NICHT um eine ComboBox, sondern um eine "ComboBoEx", welche auch KEIN eigenes Produkt meinerseits ist, sondern in Lazarus unter dem Reiter
"Misc" zu finden ist.

Sorry - deinen Satz anfangs
Es beginnt damit, dass ich eine ComboBoxEx unter Windows mit dem Ergeinis onMouseDown programmiert habe

hatte ich so verstanden, dass du eine eigene ComboboxEx geschrieben hast.

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von marcov »

Michl hat geschrieben:
hubblec4 hat geschrieben:Eine OwnerDraw ComboBox könnte möglicherweise auf allen Systemen gleich reagieren.


Aber ist wieder anders als normale Comboboxen auf das System. Die emulieren fast alles nur teilweise (denke an Tasten, Focus verhalten ,Themen, usw)

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von wp_xyz »

hubblec4 hat geschrieben:Weiterhin wollte ich das die Popupliste von der ComboBoxEx sich automatisch öffnet wenn sie geschlossen wird (also so das sie immer offen bleibt).

Wahrscheinlich verstehe ich das mal wieder nicht: Du willst, dass das Combo-Dropdown-Fenster immer offen bleibt? Warum nimmst du dann überhaupt eine Combobox und keine Listbox?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von Michl »

hubblec4 hat geschrieben:Dann wollte ich mittels Drag und Drop(Datei von der Festplatte) auf ein LabelEdit(LaE) spezielle Prozeduren aufrufen und am Ende wird ein Text ins LaE geschrieben. Windows wieder kein problem.
Aber bei Linux wird anscheinend alles eingetragen (denn beim debuggen laufen alle meine programmierten Sachen ordentlich durch, LaE Text stimmt auch),
allerdings (immer weiter debbugen mit F7 um an tiefere Proceduren zu kommen) wird dann in einer Unit in einer Procedure ein Fehler angezeigt und am Ende des debuggens steht im LaE der eigentlich Text(manchmal vollständig, manchmal fehlt ein Teil) + der komplette Datei Pfad.
Mache ich den Drop auf ein SpeedButton funktioniert das aber alles.
Ja, das sehe ich jetzt auch. Unter Windows wird keine Unterscheidung nach den auf dem Formular befindlichen Controls vorgenommen, man muss das Event OnDropFiles vom Formular auswerten.
In Linux Mint wird ein FileDragNDrop auf ein TEdit, TMemo, TComboBox etc. automatisch in das Textfeld durchgeführt, ohne daß man das Event OnDropFiles auswerten muss.

Vermutlich ist das ein gewünschtes OS abhängiges Verhalten und etwas tricky. Unter Linux Mint kann man die Controls schnell auf readonly stellen und danach wieder auf schreibbar, dann funktioniert es. Sauber ist es nicht.

Beispiel anbei.
Dateianhänge
FileDnD.zip
(1.92 KiB) 43-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von hubblec4 »

wp_xyz hat geschrieben:
hubblec4 hat geschrieben:Weiterhin wollte ich das die Popupliste von der ComboBoxEx sich automatisch öffnet wenn sie geschlossen wird (also so das sie immer offen bleibt).

Wahrscheinlich verstehe ich das mal wieder nicht: Du willst, dass das Combo-Dropdown-Fenster immer offen bleibt? Warum nimmst du dann überhaupt eine Combobox und keine Listbox?


Das ist wieder etwas unglücklich formuliert, sorry.
Eine Listbox würde ja wirklich IMMER offen bleiben, und das soll es ja auch nicht sein.
Im Prinzip wollte ich eine CheckComboBox(CCB) haben. aber auch dort schliesst sich das DropDownFenster nachdem man einen Eintrag ausgewählt hat. Meiner meinung nach ein komisch verhalten für eine CCB.
Wenn ich mehrere Einträge "checken" möchte muss man erst wieder auf die CCB klicken damit das DropDownFenster sich öffnet.
Abgesehen davon nützt mir die CCB nichts da ich dort keine Icons verwenden kann(also nicht so einfach wie mit, CCB.Glyph:=myIcon(oder ImageIndex)).

Also habe ich es unter Windows so programmiert: wenn ein eintrag gecheckt wird (dabei schliesst sich das DropDownFenster), wird das DropDownFenster gleich wieder geöffnet. Dazu ist auch nur eine einzige Zeile Code nötig.
im onClose Event der ComboBoxEx(CBE)

Code: Alles auswählen

DroppedDown:=true; // Liste wieder aufpoppen

Linux macht das wie schon oben geschrieben nicht wirklich mit. Dort habe ich mir mittels eines Timers, der erst nach 10ms das DropDownFenster wieder öffnet, beholfen(sicherlich nicht schick sowas aber mein Lazarus Wissen ist halt auch begrenzt).
Zuletzt geändert von hubblec4 am Mo 7. Nov 2016, 21:09, insgesamt 1-mal geändert.

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von hubblec4 »

Michl hat geschrieben:
hubblec4 hat geschrieben:Dann wollte ich mittels Drag und Drop(Datei von der Festplatte) auf ein LabelEdit(LaE) spezielle Prozeduren aufrufen und am Ende wird ein Text ins LaE geschrieben. Windows wieder kein problem.
Aber bei Linux wird anscheinend alles eingetragen (denn beim debuggen laufen alle meine programmierten Sachen ordentlich durch, LaE Text stimmt auch),
allerdings (immer weiter debbugen mit F7 um an tiefere Proceduren zu kommen) wird dann in einer Unit in einer Procedure ein Fehler angezeigt und am Ende des debuggens steht im LaE der eigentlich Text(manchmal vollständig, manchmal fehlt ein Teil) + der komplette Datei Pfad.
Mache ich den Drop auf ein SpeedButton funktioniert das aber alles.
Ja, das sehe ich jetzt auch. Unter Windows wird keine Unterscheidung nach den auf dem Formular befindlichen Controls vorgenommen, man muss das Event OnDropFiles vom Formular auswerten.
In Linux Mint wird ein FileDragNDrop auf ein TEdit, TMemo, TComboBox etc. automatisch in das Textfeld durchgeführt, ohne daß man das Event OnDropFiles auswerten muss.

Vermutlich ist das ein gewünschtes OS abhängiges Verhalten und etwas tricky. Unter Linux Mint kann man die Controls schnell auf readonly stellen und danach wieder auf schreibbar, dann funktioniert es. Sauber ist es nicht.

Beispiel anbei.



Ich danke dir das du dir das angeschaut hast.
Das Control (in meinem Fall sind es LabelEdit(LaE)) auf readonly stellen und danach zurück ist ja nicht wirlkich aufwendig.
Es ist sicher besser als meine Lösung. Da habe ich am ende des DragDrop vorgangs aus dem LaE.Text lediglich den String bearbeitet und das "file:///....." weggeschnitten.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von wp_xyz »

hubblec4 hat geschrieben:Also habe ich es unter Windows so programmiert: wenn ein eintrag gecheckt wird (dabei schliesst sich das DropDownFenster), wird das DropDownFenster gleich wieder geöffnet. Dazu ist auch nur eine einzige Zeile Code nötig.
im onClose Event der ComboBoxEx(CBE)

Code: Alles auswählen

DroppedDown:=true; // Liste wieder aufpoppen

Linux macht das wie schon oben geschrieben nicht wirklich mit. Dort habe ich mir mittels eines Timers, der erst nach 10ms das DropDownFenster wieder öffnet, beholfen(sicherlich nicht schick sowas aber mein Lazarus Wissen ist halt auch begrenzt).

Aber wie kannst du dann jemals das Dropdown wieder schließen?

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Unterschiedliches Verhalten - Windows und Linux

Beitrag von hubblec4 »

wp_xyz hat geschrieben:
hubblec4 hat geschrieben:Also habe ich es unter Windows so programmiert: wenn ein eintrag gecheckt wird (dabei schliesst sich das DropDownFenster), wird das DropDownFenster gleich wieder geöffnet. Dazu ist auch nur eine einzige Zeile Code nötig.
im onClose Event der ComboBoxEx(CBE)

Code: Alles auswählen

DroppedDown:=true; // Liste wieder aufpoppen

Linux macht das wie schon oben geschrieben nicht wirklich mit. Dort habe ich mir mittels eines Timers, der erst nach 10ms das DropDownFenster wieder öffnet, beholfen(sicherlich nicht schick sowas aber mein Lazarus Wissen ist halt auch begrenzt).

Aber wie kannst du dann jemals das Dropdown wieder schließen?



Hierzu muss ich sagen, dass ich mir dazu einen weiteren Workaround gebastelt habe.
Da ich ja eine CBE nutze und es dort keine "Check" Images gibt nutze ich also eigene Images.
Und nur wenn man auf ein "Check"-Icon klickt öffnet sich die DropDownListe automatisch wieder.

Damit wollte ich das Verhalten simulieren als wenn die Liste eben offen bleibt und man gemütlich alles das an- abhaken kann was man möchte.
Es gibt nur eine kleine Unschönheit bei dieser Sache. Durch das klicken auf einen Eintrag (egal ob auf das Image oder nicht) wird die Liste erstmal geschlossen und der nun ausgewählte Eintrag steht als Text in der CBE. Wenn sich nun die DropDownListe wieder öffnet befindet sich dieser ausgewählte Eintrag immer ganz oben in der DropDownListe. Dadurch sieht man dann nicht mehr was über diesem Eintrag alles an- abgehakt wurde.
(In der DropDownListe befinden sich alle Sprach Codes nach TLCC (oder wie das heist), also über 400 Einträge)

Antworten