Discussion:
Wieder eine Frage zum TShape
(zu alt für eine Antwort)
Franz Glaser
2017-12-17 17:38:49 UTC
Permalink
Vielen Dank für eure Hilfe im Frühjahr.

Das ist die Prozedur zum Eintrag "vieler" Scheibchen auf der
Landkarte mit einem Hint, sobald die Maus auf die Fläche der
kleinen Scheibe kommt.

-------------------------------------------------------------
procedure TForm01.MakeHint(X,Y,r : Integer;DiskCol:TColor;
HintString : ShortString);
var Sh: TShape;
begin
//
// Shape erzeugen und in Liste eintragen
//
Sh := TShape.Create(self);
Sh.Parent := Panel1 ; // auf (Form1) Panel1 zeichnen
Sh.Left := X-r; // berechnete Koordninaten
Sh.Top := Y-r; // "
Sh.Tag := SHList.Count; // damit wird das Shape identifiziert
Sh.Shape := stCircle;
Sh.Hint := HintString;
Sh.ShowHint := true ;
Sh.Cursor := crArrow ;
Sh.Height := 2*r;
Sh.Width := 2*r;
Sh.Brush.Color := DiskCol;
Sh.OnClick := ??? <---<<<
ShList.Add(Sh); // ab in die Liste!
LpfCount.caption := inttostr(ShList.Count); {Anzeige}
end;
-----------------------------------------------------------------

Jetzt möchte ich aber mehr als den Hint haben und dafür
brauche ich ein Ereignis, das eine Tätigkeit abwickelt,
sobald die Maus auf dem Feld ist UND KLICK gedrückt
wird oder - noch besser, UND eine Funktionstaste.

(Es hängt damit zusammen, dass der gleiche Eintrag mehrfach
vorkommen kann mit der selben Adresse und dem selben call
aber mit verschiedenen Dezibel zu verschiedenen Uhreiten.
Davon möchte ich eine Liste erstellen)

Dazu müsste ich ein _Ereignis_ eintragen wie bei den Tast-
flächen, Listboxen usw. üblich bei Mausklick und bei
Funktionstaste. Das Hintergrundbild hinter den kleinen
Scheiben ist außer Betrieb für alle seine Ereignisse, sobald
die Maus in einem der Scheibchen ist.

TShape hat zwar Onklick usw. aber ich krieg die nicht gekoppelt
mit einer Prozedur. Error: incompatible types: got "untyped"
expected "<procedure variable type of procedure(TObject) of
object; Register>"

Die andere Fehlermeldung ist, dass TShape keine class ist.

Ich habe schon viel probiert, auch eine lokale Prozedur
auf Makehint geht nicht :-)


MfG Glaser,
73 de Franz, OE5FGL
Franz Glaser
2017-12-17 22:37:55 UTC
Permalink
Am 17.12.2017 um 18:38 schrieb Franz Glaser:

Anhang.

Download der Exe mit Anhang als .zip:
http://www.meg-glaser.com/h/LOCcalc2xzip.zip

Ein screenshot Bild davon
Loading Image...

GCcalc heißt Great Circle Calculator. Der alte
Name war LOCcalc für Location calculator.
Post by Franz Glaser
Vielen Dank für eure Hilfe im Frühjahr.
Das ist die Prozedur zum Eintrag "vieler" Scheibchen auf der
Landkarte mit einem Hint, sobald die Maus auf die Fläche der
kleinen Scheibe kommt.
Ich kriegs nicht hin. Alle Hilfen, auch vom Delphi6, gehen
an der Aufgabestellung mit meiner Blockade im Kopf vorbei.


GL
--
Die "Öffentliche Meinung" ist der sozialistische Ersatzgott. Allwissend,
allmächtig und allgefürchtet. Die schlimmsten Mitmenschen sind die
Verbreiter von Gerüchten, deren Herkunft sie nicht nennen dürfen -
genannt Vernaderer. Die Medien sind dabei gesetzlich geschützt.
Hans-Peter Diettrich
2017-12-17 22:19:15 UTC
Permalink
Ich habe schon viel probiert, auch eine lokale Prozedur > auf Makehint geht nicht :-)
Ereignisse brauchen eine Methode als Handler. Dabei ist egal, zu welchem
Objekt die Methode gehört, beim Aufruf wird ja Sender übergeben.

DoDi
Achim Kalwa
2017-12-18 08:00:22 UTC
Permalink
Post by Franz Glaser
Das ist die Prozedur zum Eintrag "vieler" Scheibchen auf der
Landkarte mit einem Hint, sobald die Maus auf die Fläche der
kleinen Scheibe kommt.
[...]
Post by Franz Glaser
Jetzt möchte ich aber mehr als den Hint haben und dafür
brauche ich ein Ereignis, das eine Tätigkeit abwickelt,
sobald die Maus auf dem Feld ist UND KLICK gedrückt
wird oder - noch besser, UND eine Funktionstaste.
Ich nehme mal an, TShape ist ein normales VCL-Control (keine 3rd-Party
Komponente). TShape ist von TGraphicControl abgeleitet und hat kein
OnClick-Ereignis.

Du kannst aber das OnMouseUp-Ereignis verwenden; Du bekommst sogar noch
den Zustand der Umschalttasten (Alt, Ctrl, Shift) und die Koordinaten
des Mauszeigers als Beigabe:

procedure TForm01.ShapeMouseUp(Sender: TObject;
Shift: TShiftState;
X, Y: Integer);
var
aShape : TShape;
begin
if not (Sender is TShape) then Exit;
aShape := TShape(Sender);

if Shift = [ssAlt] then // nur bei Alt + Click
begin
// Mach was mit aShape, z.B:
ShowMessage(aShape.Hint + ' ' + IntToStr(aShape.Tag));
end;
end;

und dann in Deinem Code an der fraglichen Stelle:

Sh.OnMouseUp := ShapeMouseUp;


HTH
Achim
Franz Glaser
2017-12-18 18:04:10 UTC
Permalink
Post by Achim Kalwa
Ich nehme mal an, TShape ist ein normales VCL-Control (keine 3rd-Party
Komponente). TShape ist von TGraphicControl abgeleitet und hat kein
OnClick-Ereignis.
Du kannst aber das OnMouseUp-Ereignis verwenden; Du bekommst sogar noch
den Zustand der Umschalttasten (Alt, Ctrl, Shift) und die Koordinaten
procedure TForm01.ShapeMouseUp(Sender: TObject;
Shift: TShiftState;
X, Y: Integer);
var
aShape : TShape;
begin
if not (Sender is TShape) then Exit;
aShape := TShape(Sender);
if Shift = [ssAlt] then // nur bei Alt + Click
begin
ShowMessage(aShape.Hint + ' ' + IntToStr(aShape.Tag));
end;
end;
Sh.OnMouseUp := ShapeMouseUp;
Da protestiert er, weil ihm die Zahl der Parameter nicht passt-

Da bin ich der Sache nachgegangen, OnMouseUp ist ein TMouseEvent, das
zusätzlich zu den angeführten Parametern einen Button: TMouseButton;
nach dem Sender:TObject; braucht.

Dafür habe ich in meine Hauptdefinition TForm01 unter private
den Eintrag ShapeMouseUp : TMouseEvent ; - aber der ist ohne
Bedeutung. Nicht ganz, beim Compilieren sind die Fehler weg
aber das laufende Programm tut nichts.

Versuchsweise habe ich alle IFs entfernt, nutzt nix, der Eintrag
in die Liste Sh.OnMouseUp := ShapeMouseUp; ist wirkungslos.

Das ganze habe ich mit ShapeMouseClick : TNotifyEvent ;
auch probiert, der nur den Parameter Sender:TObject enthält.
Alle "ifs" in der Prozedur habe ich // entfernt, sodass nur
die ShowMessage übrig geblieben ist. Sie showt und messaget
nichts, der Comiler ist auch zufrieden.

TForm01.ShapeMouseUp( geht gar nicht.

Ich mache was ganz Grundsätzliches und wahrscheinlich was
Triviales falsch.

73 de Franz, OE5FGL
--
"Der Edle bewegt sich stets so, daß sein Auftreten zu jeder Zeit als
allgemeines Beispiel gelten kann. Er benimmt sich so, dass sein Ver-
halten jederzeit als allgemeines Gesetz dienen kann. Und er spricht
so, daß sein Wort zu jeder Zeit als allgemeine Norm gelten kann."
(Konfuzius)
Achim Kalwa
2017-12-18 20:36:23 UTC
Permalink
Moin,
Post by Franz Glaser
  Sh.OnMouseUp := ShapeMouseUp;
Da protestiert er, weil ihm die Zahl der Parameter nicht passt-
Stimmt. Ich habe den Code direkt in die Nachricht getippt; tatsächlich
ist noch Button: TMouseButton erforderlich:

procedure TForm1.ShapeClicked(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ShowMessage('Shape clicked');
end;
Post by Franz Glaser
Dafür habe ich in meine Hauptdefinition TForm01 unter private
den Eintrag ShapeMouseUp : TMouseEvent ; - aber der ist ohne
Bedeutung. Nicht ganz, beim Compilieren sind die Fehler weg
aber das laufende Programm tut nichts.
Falscher Ansatz. Du hast eine neue Variable des typs TMouseEvent
deklariert. Mach das wieder weg :-) Du musst im Interface-Teil natürlich
die Methode procedure ShapeClicked(Sender....) definieren.

Setz' doch mal in einem Test-Projekt auf einem leeren Form ein Shape,
gehe in den Objektinspektor auf die Seite "Events" und mache in der
Zeile "OnMouseUp" einen Doppelklick. Jetzt hast Du im Code im
Interface-Teil die Deklaration "ShapeMouseUp"; und im
Implementation-Teil die noch leere Methode "ShapeMouseUp". Diese beiden
Code-Fragmente brauchst Du auch in Deinem Projekt. Einzig die Zuweisung
des Methodennamens an den Event-Handler des Shapes passiert dann per Code:

Sh.OnMouseUp := ShapeMouseUp;

HTH
Achim

Loading...