Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 06.10.22 14:53 
Hallo!

Ich verwende TJvTabBar von den Jedis. Wenn man mit gedrückter linker Maustaste ein Tab aus dem TabBar-Bereich "herauszieht", wird der Mauscursor als crNoDrop dargestellt, damit der Benutzer weiss, dass Tabs nur innerhalb der TabBar an eine andere Stelle gezogen werden können. So weit klar.

Ich möchte aber stattdessen crDrag als Mauscursor anzeigen, da ich mein Programm so gestaltet habe, dass man Tabs auch ausserhalb der TabBar ablegen kann. Da passt nun crNoDrop nicht mehr.

Den Cursor einfach auf crDrag setzen nützt nichts, das wird ignoriert. Der Cursor wird nämlich in Vcl.Controls.pas gesetzt, und so, wie ich das sehe, hat das auch nichts mit der Komponente TJvTabBar als solcher zu tun, das scheint einfach das Standardverhalten bei allen TabBar-artigen Komponenten zu sein.

Kurz also: Wie "überschreibe" ich den Mauscursor crNoDrop, wenn ich das nicht einfach mit [...].Cursor := crDrag machen kann?
Ich habe mit meinem Delphi 10.1 keinen Zugriff auf Vcl.Controls.pas!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 06.10.22 16:15 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe mit meinem Delphi 10.1 keinen Zugriff auf Vcl.Controls.pas!
In der kostenlosen Community Edition sind die Quelltexte dabei...

Davon abgesehen wird das aber wohl eher in den Quelltexten der JEDIs passieren.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 06.10.22 16:39 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe mit meinem Delphi 10.1 keinen Zugriff auf Vcl.Controls.pas!
In der kostenlosen Community Edition sind die Quelltexte dabei...
Nicht aber in der Starter Edition!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Davon abgesehen wird das aber wohl eher in den Quelltexten der JEDIs passieren.
Kann ich das denn überhaupt von meinem Programm aus ändern, kann man zB. crNoDrop mit einem eigenen Cursor überschreiben?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 06.10.22 23:24 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
In der kostenlosen Community Edition sind die Quelltexte dabei...
Nicht aber in der Starter Edition!
Eben, deshalb bietet sich ja die Community Edition an, um solche Probleme zu debuggen.

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Davon abgesehen wird das aber wohl eher in den Quelltexten der JEDIs passieren.
Kann ich das denn überhaupt von meinem Programm aus ändern, kann man zB. crNoDrop mit einem eigenen Cursor überschreiben?
Sollte es bei deinem Anwendungsfall nicht reichen, wenn du Accept im OnDragOver der Zielkomponenten auf True setzt?
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 08.10.22 21:33 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
deshalb bietet sich ja die Community Edition an, um solche Probleme zu debuggen.
Ich sehe nicht ein, warum ich jährlich ein neues Delphi installieren muss, obwohl ich das gar nicht brauche. Gut, ein Update der bestehenden Edition würde ich ja noch akzeptieren.
Das ist ein eigenes Thema... :|

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Sollte es bei deinem Anwendungsfall nicht reichen, wenn du Accept im OnDragOver der Zielkomponenten auf True setzt?
Nein, das nützt nichts. Der Cursor wird geändert, sobald man ein Tab mit der Maus zieht. Abhängig davon, ob die Maus auf einem Tab oder irgendwo anders ist, ändert sich der Cursor entweder zu crDrag oder zu crNoDrop.
Das wird nicht von den Jedis gesteuert, sondern in Vcl.Controls.pas. Da kann man nichts ändern, ausser, man modifiziert die Vcl.Controls.pas. Ich kann das aber nicht, daher meine Frage. (Ja, ich weiss, mit der Community Edition könnte ich das!).
Leider akzeptiert Delphi 10.1 die Vcl.Controls.pas von Delphi 10.3 aber nicht. Und bei 10.3 ist die Lizenz abgelaufen.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 09.10.22 22:06 
Also ich kann das nicht reproduzieren. Ich kann (wenn AllowTabMoving auf True steht) problemlos einen Tab dieser Komponente z.B. auf ein Panel ziehen und der Cursor wird über dem Panel auch korrekt als "ablegbar" angezeigt. :nixweiss:

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Ich sehe nicht ein, warum ich jährlich ein neues Delphi installieren muss, obwohl ich das gar nicht brauche.
Erstens halte ich diesen Preis für sehr gering und zweitens möchte Embarcadero vermutlich nicht wieder, dass so viele an kostenlosen alten Versionen kleben und auf dieser Basis auch in Foren mitreden, obwohl es neue Versionen gibt...
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 10.10.22 15:40 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Erstens halte ich diesen Preis für sehr gering
Aber mir ist das lästig.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
und zweitens möchte Embarcadero vermutlich nicht wieder, dass so viele an kostenlosen alten Versionen kleben und auf dieser Basis auch in Foren mitreden, obwohl es neue Versionen gibt...
Ja, ich kenne dieses Argument.


Aber zum Thema:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Also ich kann das nicht reproduzieren. Ich kann (wenn AllowTabMoving auf True steht) problemlos einen Tab dieser Komponente z.B. auf ein Panel ziehen und der Cursor wird über dem Panel auch korrekt als "ablegbar" angezeigt. :nixweiss:
Ja, AllowTabMoving := True.
So sieht das in Vcl.Controls.pas aus (Delphi 10.3, bei Delphi 10.1 wird's wohl auch so sein):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function TDragControlObject.GetDragCursor(Accepted: Boolean; X, Y: Integer): TCursor;
begin
  if Accepted then Result := Control.DragCursor
  else
    Result := crNoDrop;
end;

Man hält also die linke Maustaste gedrückt und zieht ein Tab. Dabei ist ständig obiger Code aktiv - muss so sein, denn das Programm macht genau das, was da steht: Solange man über einem anderen Tab ist (Accepted = True), ist der Cursor crDrag. Ist die Maus über irgendeiner anderen Komponente, ist der Cursor crNoDrop, weil Accepted = False. Da bringt es nichts, Cursor := crDrag in OnMouseMove der TabBar zu schreiben, oder irgendeiner anderen Komponente irgendeinen Cursor zuweisen: Sobald du ein Tab "ziehst", tut das Programm, was in Funktion TDragControlObject.GetDragCursor steht, wobei OnMouseMove völlig ignoriert wird, wenn die linke Maustaste gedrückt ist.

Auch seltsam: OnMouseUp der TabBar wird ausgelöst, sobald man die linke Maustaste drückt!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!


Zuletzt bearbeitet von galagher am Mo 10.10.22 15:42, insgesamt 2-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 10.10.22 15:41 
Moin!

Ist zwar OT, aber trotzdem:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Ich sehe nicht ein, warum ich jährlich ein neues Delphi installieren muss, obwohl ich das gar nicht brauche.
Erstens halte ich diesen Preis für sehr gering und zweitens möchte Embarcadero vermutlich nicht wieder, dass so viele an kostenlosen alten Versionen kleben und auf dieser Basis auch in Foren mitreden, obwohl es neue Versionen gibt...
Tja, wenn man die Installation updaten könnte, dann könnte ich auch ein gewisses Verständnis dafür aufbringen, aber jedes mal wieder bei 0 anfangen und alles neu aufsetzen?! :roll: :schmoll:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 10.10.22 15:43 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
aber jedes mal wieder bei 0 anfangen und alles neu aufsetzen?! :roll: :schmoll:
Eben!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 10.10.22 18:26 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Man hält also die linke Maustaste gedrückt und zieht ein Tab. Dabei ist ständig obiger Code aktiv - muss so sein, denn das Programm macht genau das, was da steht: Solange man über einem anderen Tab ist (Accepted = True), ist der Cursor crDrag. Ist die Maus über irgendeiner anderen Komponente, ist der Cursor crNoDrop, weil Accepted = False. Da bringt es nichts, Cursor := crDrag in OnMouseMove der TabBar zu schreiben
Ich glaube du hast das Drag-And-Drop System von Delphi noch nicht verstanden. Den Cursor irgendwo manuell zu ändern, macht keinerlei Sinn, da dies dann nicht den Drag-Status widerspiegeln würde...

Ich habe das OnDragOver ja bereits erwähnt. Dort steuert man das Accept, das in dem von dir gezeigten Code verwendet wird. Wenn in der Zielkomponente ein OnDragOver zugewiesen ist, ist Accept standardmäßig True, kann dort aber auch auf False gesetzt werden. Ist kein OnDragOver zugewiesen, ist Accept False und entsprechend wird der Cursor so angezeigt, wie du es erlebt hast.

Und im OnDragDrop reagiert man dann auf das Fallenlassen.

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Tja, wenn man die Installation updaten könnte, dann könnte ich auch ein gewisses Verständnis dafür aufbringen, aber jedes mal wieder bei 0 anfangen und alles neu aufsetzen?! :roll: :schmoll:
Ich sehe das viel größere Problem darin, dass viele gar nicht wissen, was so alles in ihrer Installation steckt und es vielleicht auch gar nicht verstehen. Dabei habe ich ja schon vielen geholfen, von daher kenne ich das gut. Deshalb verwenden ja auch viele das Tool zum Übertragen der Einstellungen in eine neue Version, das aber auch selbst wieder Probleme macht.

Wenn man sich einmal damit beschäftigt und aufschreibt, was man braucht und installieren muss, geht das sehr schnell.

Ich selbst habe dafür schon mehrere Tools geschrieben, für zwei verschiedene Arbeitgeber, die dies komplett automatisieren. Die Installation braucht so nur einen einzigen Doppelklick auf eine Batchdatei, inklusive Lizenzschlüssel für Drittkomponenten, aus Setups extrahierte Drittkomponenten usw.

Den Aufwand muss natürlich nicht jeder betreiben, aber sich zumindest damit beschäftigen und eben den manuellen Weg dokumentieren, sollte jeder machen. Dann hat man auch keine Probleme mehr damit, weil das in sehr kurzer Zeit alles erledigt ist.

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 10.10.22 20:17 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe das OnDragOver ja bereits erwähnt. Dort steuert man das Accept, das in dem von dir gezeigten Code verwendet wird. Wenn in der Zielkomponente ein OnDragOver zugewiesen ist, ist Accept standardmäßig True, kann dort aber auch auf False gesetzt werden. Ist kein OnDragOver zugewiesen, ist Accept False und entsprechend wird der Cursor so angezeigt, wie du es erlebt hast.
So funktioniert es jetzt endlich!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!