![]() |
Pointerziel sichern oder wie? hä?
AUf die Gefahr hin, dass ich euch nerve:
...Ist wahrscheinlich wieder nur halb so kompliziert wie der Post lang... - Es geht wieder um mein Schachspiel - Beim Klick auf ein Feld soll hier der einfachheit halber mal nur ein, anfangs unsichtbarer, roter Rahmen sichtbar werden ( = selektiert werden) - Zuvor soll der Rahmen des Feldes, das davor selektiert war wieder durchsichtig werden. - dazu wird im OnMouseUp-Event jedes Schachfeldes die Prozedur SelectField aufgerufen - das aktuell ausgewählte Feld wird im Globalen Pointer PClickedField gespeichert Die Prozedur sieht so aus:
Delphi-Quellcode:
Natürlich funktioniert sie nicht. Zwar erhalten die angeklickten Felder einen Rahmen, aber sie behalten sie auch. Ist ja logisch:
procedure TForm1.SelectField(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin if PClickedField <> NIL then PClickedField.Pen.Style := psClear; PClickedField := @Sender; PClickedField.Pen.Style := psSolid; end; (jetzt kommt meine Theorie dazu, könnt ihr eigentlich auch überspringen ^^} Bei jedem Aufruf der Prozedur wird gleich beim aufrufen die Stelle im Speicher wo der vorherige Sender gespeichert ist, durch den Sender ersetzt, der die Prozedur diesmal aufruft. Der Pointer ist ja nur ein Zeiger der immer auf die selbe Speicheradresse zeigt, nämlich die, an der Die Prozedur SelectField den Wert des Senders speichert. An der Stelle
Delphi-Quellcode:
nochmal verwiesen wird. Den die Speicheradresse bleibt ja die selbe, nur der Inhalt ändert sich.
PCLickedField.Pen.Style := psClear;
{...zeigt der Pointer also schon auf die selbe Stelle an die er kurz darauf von..} PClickedField := @Sender; Die Prozedur macht also blöderweise den Rahmen eines Feldes erst unsichtbar und dann gleich wieder sichtbar (was man aber nicht sieht). {Jedenfalls Denk ich das, korrigiert mich wenn ich mich irre - bein ein Newb was Delphi und vor allem Zeiger betrifft} Ich brauch also eure Hilfe! :coder2: Wie kann ich das zuvor selektierte Feld bzw. eine Referenz darauf am besten "speichern"? Oder wie sollte man das am besten lösen? +Danke Schon mal! :| |
Re: Pointerziel sichern oder wie? hä?
moin,
da Delphi bei Klassen/Objekten eh immer mit Zeigern arbeitet (und auch nur diese kopiert) kannst du die eigentlich die ganzen @s sparen. Probiers einfach mal mit:
Delphi-Quellcode:
procedure TForm1.SelectField(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin if PClickedField <> NIL then PClickedField.Pen.Style := psClear; PClickedField := Sender; PClickedField.Pen.Style := psSolid; end; |
Re: Pointerziel sichern oder wie? hä?
ne, ohne das @ gehts nich (Incompatible Types: 'TObject' and 'Pointer')
liegt viellecht an der Delphi version (7 Personal) oder so. Dankeschön trotzdem (leider hilft mir das beim eigentlichen Problem auch nich weiter :( ) |
Re: Pointerziel sichern oder wie? hä?
Nimm doch statt einem Pointer auf TObject direkt ein TObject oder den Typ des benutzen Objekts. Dann gehts auch ohne @s ;-)
|
Re: Pointerziel sichern oder wie? hä?
Natürlich geht es ohne @. Du solltest PClickedField halt nicht als Pointer, sondern als TShape (oder was auch immer) deklarieren. Nebenbei solltest du sie nicht global deklarieren, sondern in dem Fall im private-Abschnitt von TForm1.
Delphi-Quellcode:
In Delphi brauchst du im Normalfall den Adressoperator nicht.
type
TForm1 = class(TForm) {...} private FClickedField: TShape; public {...} end; {...} procedure TForm1.SelectField(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if FClickedField <> nil then FClickedField.Pen.Style := psClear; FClickedField := TShape(Sender); FClickedField.Pen.Style := psSolid; end; |
Re: Pointerziel sichern oder wie? hä?
Yaaay! Es geht! Danke! :spin:
Langsam fang ich an das zu verstehen. Dankeschön! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz