AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pointerziel sichern oder wie? hä?

Ein Thema von soup · begonnen am 5. Feb 2005 · letzter Beitrag vom 5. Feb 2005
Antwort Antwort
Benutzerbild von soup
soup

Registriert seit: 5. Feb 2005
9 Beiträge
 
Delphi 7 Personal
 
#1

Pointerziel sichern oder wie? hä?

  Alt 5. Feb 2005, 16:05
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!
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!
  Mit Zitat antworten Zitat
xineohp

Registriert seit: 29. Jan 2004
Ort: Heusenstamm
420 Beiträge
 
Delphi 2005 Professional
 
#2

Re: Pointerziel sichern oder wie? hä?

  Alt 5. Feb 2005, 16:12
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;
Peter Enenkel
blubb
  Mit Zitat antworten Zitat
Benutzerbild von soup
soup

Registriert seit: 5. Feb 2005
9 Beiträge
 
Delphi 7 Personal
 
#3

Re: Pointerziel sichern oder wie? hä?

  Alt 5. Feb 2005, 16:21
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 )
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Pointerziel sichern oder wie? hä?

  Alt 5. Feb 2005, 16:24
Nimm doch statt einem Pointer auf TObject direkt ein TObject oder den Typ des benutzen Objekts. Dann gehts auch ohne @s
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#5

Re: Pointerziel sichern oder wie? hä?

  Alt 5. Feb 2005, 16:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von soup
soup

Registriert seit: 5. Feb 2005
9 Beiträge
 
Delphi 7 Personal
 
#6

Re: Pointerziel sichern oder wie? hä?

  Alt 5. Feb 2005, 16:47
Yaaay! Es geht! Danke!
Langsam fang ich an das zu verstehen. Dankeschön!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 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