Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointerziel sichern oder wie? hä? (https://www.delphipraxis.net/39633-pointerziel-sichern-oder-wie-hae.html)

soup 5. Feb 2005 15:05


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:
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;
Natürlich funktioniert sie nicht. Zwar erhalten die angeklickten Felder einen Rahmen, aber sie behalten sie auch. Ist ja logisch:
(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:
PCLickedField.Pen.Style := psClear;
 {...zeigt der Pointer also schon auf die selbe Stelle an die er kurz darauf von..}
PClickedField := @Sender;
nochmal verwiesen wird. Den die Speicheradresse bleibt ja die selbe, nur der Inhalt ändert sich.
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! :|

xineohp 5. Feb 2005 15:12

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;

soup 5. Feb 2005 15:21

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 :( )

Dax 5. Feb 2005 15:24

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 ;-)

Oxmyx 5. Feb 2005 15:29

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:
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;
In Delphi brauchst du im Normalfall den Adressoperator nicht.

soup 5. Feb 2005 15:47

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 15:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz