Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TEdit in Klasse ? (https://www.delphipraxis.net/45530-tedit-klasse.html)

richard_boderich 7. Mai 2005 21:28


TEdit in Klasse ?
 
Hallo Leute!

Ich habe mal ne Frage zu Klassen. Ich moechte ein Teditfeld in einer selbsterstellten
Klasse nutzen, und folgendermaßen ansprechen.

Delphi-Quellcode:
Label1.caption:=Klasse.edit1.text;
Ist sowas überhaupt realisierbar oder muss ich dafür eine Komponente erstellen?
Bisher habe ich in Klassen nur Variablen benutzt. Ich würde mich über eine kleines
Beispiel freuen, das zeigt wie ich ein Tedit bzw. eine anderes Object der VCL in eine Klasse einbinden kann.

So long,

Euer Richard

Ultimator 7. Mai 2005 21:35

Re: TEdit in Klasse ?
 
Klar geht das.
Zitat:

Bisher habe ich in Klassen nur Variablen benutzt.
Dein Edit1 ist ja auch nur eine Variable, und zwar vom Typ TEdit ;)

jfheins 7. Mai 2005 21:37

Re: TEdit in Klasse ?
 
Naja, du kannst das Edit als Unterobjekt definieren, z.B. so:
Delphi-Quellcode:
TMyCFlass = class
published
Edit1: TEdit;
end;
Dann kannst du imho normal auf das Edit zugreigen (Instanz.Edit1.Text usw.)

So kannst du auch gewisse Eigenschaften wieder verbergen, die das Edit hatte, einfach im Private Teil deklarieren, und dann ein paar Wrapperfunktionen schreiben ... :coder: :roll: :wall:

richard_boderich 7. Mai 2005 22:52

Re: TEdit in Klasse ?
 
@All,

wenn ich die Klasse definiert hab. Und ich führe 2 x ein create aus, so hatt er dann doch 2 objecte von der Klasse erstellt. Sozusagen 2 instanzen vom selben Typ. Gibt es eine
Möglichkeit dann die beiden objecte Anhand eines unterschiedlichen Bezeichners anzusprechen?

z.B. meineKlasse1 1. Object, meineKlasse2 2. Object oder muss ich dafür ein
Array of Class machen?

es koennte auch sein das ich sowas benoetige

Delphi-Quellcode:
For i:=1 to 200 do
begin
create.meineklasse[i]
end;

Ultimator 7. Mai 2005 23:04

Re: TEdit in Klasse ?
 
Also du hast eine Klasse MyClass1.
Und du möchtest zwei Instanzen davon erzeugen.
Dann brauchst du auch zwei Variablen vom Typ MyClass1.
Wenn du aber nicht weißt, wie viele Instanzen du benötigst, dann musst du ein Array nehmen.
Ich weiß nicht, ob nicht vielleicht auch Listen gingen, weil ich mich damit nicht weiter auskenne :oops:

Zur unteren Frage:

Verstehe ich das richtig:
Du hast ein paar Klassen, angenommen namens MyClass42 bis MyClass666 (:mrgreen:).
Und du möchtest von jeder Klasse eine Instanz erstellen?
Das erscheint mir so gut wie unmöglich :-?
Wenn du zudem noch eine variable Anzahl an Instanzen dieser Klassen benötigst, dann brauchst du ja auch noch arrays of Wasweißich, evtrl. sogar array of Variant :shock:

Also das kann ich mir fast nicht vorstellen, dass das geht :?

richard_boderich 7. Mai 2005 23:26

Re: TEdit in Klasse ?
 
@Ultimator,

Es ist etwas schwer zu erklaeren. Ich programmiere grad eine Strategiemap für unseren Clan.

auf der Map kann ich Marker, Einheiten, Spieler und soweiter setzten. Ich würde das gern mit
Objecten machen.

nehmen wir an ich habe für jeden Einheitentyp eine eingene Klasse z.b

"Infantry" , "Luftabwehr" , "Panzer"
-----------------------------------------------------
1. Instanz ............................................Panzer 1
2. Instanz ............................................Panzer 2


wenn nun der spieler eine einheitentyp waehlt, soll dort wo er auf die Karte klickt ein entsprechendes
Object erscheinen. Nehmen wir mal an er erstellt 2 Panzer. Das sind 2 objecte mit namen "Panzer1" und "Panzer2" Obige Tabelle soll das mal verdeutlichen.

nehmen wir aber mal an. der spieler will die Psition der einheit aendern und klickt auf die einheit.
Jetzt habe ich das Problem wie ich diejenige Instanz ermittle die zu dem angeklickten object gehört.

ich muss ja dann eine Procedure schreiben die ein bewegen der einheiten ermoeglicht. Da ich nicht für jede instanz eine extra Procedure machen will, muss ich ja dann sowas machen.

Delphi-Quellcode:

Panzer[x].left:=20;
ICh hoffe du verstehts jetzt mein Problem.

So long

Richard

Hansa 7. Mai 2005 23:27

Re: TEdit in Klasse ?
 
Zitat:

Zitat von jfheins
Naja, du kannst das Edit als Unterobjekt definieren, z.B. so:
Delphi-Quellcode:
TMyCFlass = class
published
Edit1: TEdit;
end;
Dann kannst du imho normal auf das Edit zugreigen (Instanz.Edit1.Text usw.)

So kannst du auch gewisse Eigenschaften wieder verbergen, die das Edit hatte, einfach im Private Teil deklarieren, und dann ein paar Wrapperfunktionen schreiben ... :coder: :roll: :wall:

Sorry, aber bist du nicht mehr ganz fix ? :mrgreen: Was erzählst du denn da für seltsames Zeugs mit Wrapper-Klassen usw. ? Um es vorwegzunehmen : das da geht ziemlich in Richtung Komponentenentwicklung. Richard soll mal bitte etwas näher beschreiben, um was es geht.

richard_boderich 7. Mai 2005 23:34

Re: TEdit in Klasse ?
 
@Hansa,

^^ hab es oben mal genauer versucht zu erklaeren. hoffe es ist verstaendlich.

Richard

richard_boderich 7. Mai 2005 23:47

Re: TEdit in Klasse ?
 
@Hansa,

kann ich da nicht einfach (sender:Tobject) abfragen?

Hansa 7. Mai 2005 23:52

Re: TEdit in Klasse ?
 
Ja, so ist es fast verständlich. Jeder Spieler wird ja wohl eine Namen haben ? Dann benutzte die Methode Addobject. Die ist in der Hierarchie mind. ab TStrings vorhanden. Aber ich muß dich trotzdem warnen : wenn das auch keine eigene Komponente erfordert, dann doch zumindest eigene Objekte. Und da muß genau überlegt werden wie sie aussehen und wie sie gehandhabt werden, also wann anlegen wann freigeben usw. Nicht ganz trivial. 8)

P.S. : Wie einfach Sender abfangen ?

richard_boderich 8. Mai 2005 04:01

Re: TEdit in Klasse ?
 
@Hansa


Habe versucht das mal in einer eigenen Klasse zusammenzufassen. Bekomme aber immer eine Schutzverletzung und
weiß nicht warum. :gruebel:



Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, XPMan, StdCtrls, ComCtrls, Menus, ToolWin,
  Buttons, JvHtControls, JvGIF, ImgList;

type
  TForm1 = class(TForm)
    XPManifest1: TXPManifest;
    procedure FormClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TMapObject = class(Tform)
  private
    Image: TImage;                // Für das entsprechende Einheitenbild besser vielleicht Imagelist, kann imagelist nur bmp ich brauch aber gif?
    Edit: TEdit;                  // Eingabefeld für Einheitenname
    Einheitenname: TStaticText;   // Anzeige des Einheitennamens
    X,Y: Integer;                 // Position der Einheit auf Karte Y
    Typ: String;                  // z.B. "Infantry", Image ist abhaengig vom Einheitentyp wo kann ich diese Abhaengigkeit berechnen oder festlegen z.B wenn Einheitentyp = 2  dann image.picture.'Panzer.bmp"
                                   //draggen ermoeglichen und draggingstatus

  published
    property Einheitentyp :String read Typ write Typ;
    property MapX :Integer read x write x;
    property MapY :Integer read y write y;

  public


    { Public-Deklarationen }
  end;



var
  Form1: TForm1;
  dra,helper:boolean;
  terrorspeicherx,terrorspeichery,xx,yy,terrorx,terrory:Integer;
  mapobject1:tmapobject;
  implementation

{$R *.dfm}



procedure TForm1.FormClick(Sender: TObject);
begin
mapobject1:=Tmapobject.create(form1);
mapobject1.show;
mapobject1.einheitenname.Caption:='test';
mapobject1.einheitenname.show;
end;

end.

Sharky 8. Mai 2005 06:37

Re: TEdit in Klasse ?
 
Hai Richard,

Du musst die Objekte in deiner Klasse erst "Createn". Schreibe Dir also einen eignen Delphi-Referenz durchsuchenconstructor in dem Du diese erzeugst und einen Delphi-Referenz durchsuchendestructor wo Du sie auch wieder freigibst.


P.S.: Warum nimmst Du in diesem Fall nich eine "normale" Form. Setzt deine Objekte darauf und erzeugst dir zur Laufzeit soviele davon wie Du brauchst?

Hansa 8. Mai 2005 13:50

Re: TEdit in Klasse ?
 
Erstens mal das mit der Form. Glaube nicht, daß das auf diese Art überhaupt gehen kann. Aus dem Source ist jetzt aber einigermaßen ersichtlich, was gemacht werden soll. Allerdings stört mich noch was : Das TEdit in dem Object. Glaube fast nicht, daß das automatisch mit erzeugt wird. Die Objekte sind nämlich ziemlich dumm. Allerdings frage ich mich gerade, warum du kein StringGrid verwendest ? Damit wäre das mit der Form und auch das TEdit erledigt. Jeder beliebigen Zelle kann man da ein TObject "anheften". Also ich würde es so machen : für jede Spalte einen eigenen TObject-Typ und basta. Herrje, da ist ja noch ein TImage. Dann gib dem Objekt der Image-Spalte am Besten nur den Dateinamen mit und behandele das Ganze dann mit
Delphi-Quellcode:
LoadFromFile (MeinImageObject.Filename)
im OnDrawCell. Ja, im Prinzip müßte das Ganze einwandfrei so gehen. Einfach wirds aber nicht gerade (erzeugen spaltenabhängiger TObjects, diese freigeben usw.). Alles andere wäre aber wohl noch komplizierter.

richard_boderich 8. Mai 2005 13:53

Re: TEdit in Klasse ?
 
Hallo Sharky!

Hab mir jetzt nen Constructor und Destructor erstellt.
Mein Project knippst aber die gesamte Deplhi Ide und den Debugger aus! :shock:
Langsam glaube ich es war doch keine so gute Idee das mit Klassen machen zu wollen
Ich dachte, das ich mir viel tipparbeit ersparen kann (der ganze record, array of record mist und das record speicherproblem), wenn ich das mit Klassen machen die nur meine benoetigten Eigenschaften und unterobjecte kapseln, aber das hier artet ja schon echt aus.
Ich bekomme ja nicht mal das Object erstellt :( .


Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, XPMan, StdCtrls, ComCtrls, Menus, ToolWin,
  Buttons, JvHtControls, JvGIF, ImgList;

type
  TForm1 = class(TForm)
    XPManifest1: TXPManifest;
    procedure FormClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TMapObject = class(TControl)
  private
    Image: TImage;                // Für das entsprechende Einheitenbild besser vielleicht Imagelist, kann imagelist nur bmp ich brauch aber gif?
    Edit: TEdit;                  // Eingabefeld für Einheitenname
    Einheitenname: TStaticText;   // Anzeige des Einheitennamens
    X,Y: Integer;                 // Position der Einheit auf Karte Y
    Typ: String;                  // z.B. "Infantry", Image ist abhaengig vom Einheitentyp wo kann ich diese Abhaengigkeit berechnen oder festlegen z.B wenn Einheitentyp = 2  dann image.picture.'Panzer.bmp"
                                   //draggen ermoeglichen und draggingstatus

  published
    property Einheitentyp :String read Typ write Typ;
    property MapX :Integer read x write x;
    property MapY :Integer read y write y;

  public
    constructor Create(Owner: TComponent); override;
    destructor Destroy; override;


    { Public-Deklarationen }
  end;


var
  Form1: TForm1;
  mapobject1:tmapobject;
  implementation

{$R *.dfm}

constructor TMapObject.Create(Owner: TComponent);

begin
  Create(image);
  Create(edit);
  Create(Einheitenname);
end;

destructor TMapObject.destroy;
begin
  edit.free;
  image.free;
  einheitenname.free
end;



procedure TForm1.FormClick(Sender: TObject);
begin
mapobject1:=Tmapobject.create(self);
//mapobject1.show;
mapobject1.einheitenname.Caption:='test';
mapobject1.einheitenname.show;
end;

end.

Die Muhkuh 8. Mai 2005 14:12

Re: TEdit in Klasse ?
 
Zitat:

Zitat von richard_boderich
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, XPMan, StdCtrls, ComCtrls, Menus, ToolWin,
  Buttons, JvHtControls, JvGIF, ImgList;

type
  TForm1 = class(TForm)
    XPManifest1: TXPManifest;
    procedure FormClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TMapObject = class(TControl)
  private
    Image: TImage;                // Für das entsprechende Einheitenbild besser vielleicht Imagelist, kann imagelist nur bmp ich brauch aber gif?
    Edit: TEdit;                  // Eingabefeld für Einheitenname
    Einheitenname: TStaticText;   // Anzeige des Einheitennamens
    X,Y: Integer;                 // Position der Einheit auf Karte Y
    Typ: String;                  // z.B. "Infantry", Image ist abhaengig vom Einheitentyp wo kann ich diese Abhaengigkeit berechnen oder festlegen z.B wenn Einheitentyp = 2  dann image.picture.'Panzer.bmp"
                                   //draggen ermoeglichen und draggingstatus

  published
    property Einheitentyp :String read Typ write Typ;
    property MapX :Integer read x write x;
    property MapY :Integer read y write y;

  public
    constructor Create(Owner: TComponent); override;
    destructor Destroy; override;


    { Public-Deklarationen }
  end;


var
  Form1: TForm1;
  mapobject1:tmapobject;
  implementation

{$R *.dfm}

constructor TMapObject.Create(Owner: TComponent);

begin
  Image := TImage.Create(Owner); // So muss das heißen
  Edit := TEdit.Create(Owner);
  EnheitenName := TStaticText.Create(Owner);
end;

destructor TMapObject.destroy;
begin
  edit.free;
  image.free;
  einheitenname.free
end;



procedure TForm1.FormClick(Sender: TObject);
begin
mapobject1:=Tmapobject.create(self);
//mapobject1.show;
mapobject1.einheitenname.Caption:='test';
mapobject1.einheitenname.show;
end;

end.


richard_boderich 8. Mai 2005 14:41

Re: TEdit in Klasse ?
 
@ Spider,

willst du mir damit was sagen ?

Ich versuche jetzt nochmal zu erklaeren was ich will,vielleicht hab ich ja auch einen Denkfehler drin

Image: Timage
edit:Tedit;
Einheitenname: Tstatictext;
Mapx,Mapy:integer;


1. klick mit linker maus taste auf form
im onmousedown des forms
2. Tmapobject1.create;
2.1 zuweisen der Mauskoordinaten an Tmapobject (mapx,mapy);
3. wenn mapobject erstellt
4. zeige image an (mapx,mapY);
5. zeige edit an (mapx,mapy);
6. gib edit den focus
7. in onkeydown event von edit
7.1 if key=vk_return dann Einheitenname.caption:=edit.text
7.3 Positioniere Einheitenname (left,top);
7.2 Einheitenname.show;
8. fertig

Ich hoffe es ist ersichtlich wie ich mir das vorstelle

So long

Richard



//EDIT Sorry Spider hatte deinen Kommentar übersehen, jetzt stürtz es wenigstens nicht mehr ab. thx

Khabarakh 8. Mai 2005 15:25

Re: TEdit in Klasse ?
 
Würde es denn nicht reichen, ein Edit auf der Form für alle Objekte zu nehmen?

richard_boderich 8. Mai 2005 16:22

Re: TEdit in Klasse ?
 
@Khabarakh

das waere sicherlich moeglich. Hab aber ganz andere sorgen, das object wird jetzt erstellt,
aber ich kann das edit und den statictext nicht anzeigenlassen. wenn ich z.b einheitenname.show aufrufe
passiert garnichts.


Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, XPMan, StdCtrls, ComCtrls, Menus, ToolWin,
  Buttons, JvHtControls, JvGIF, ImgList;

type
  TForm1 = class(TForm)
    XPManifest1: TXPManifest;
    procedure FormClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TMapObject = class(TControl)
  private
    Image: TImage;                // Für das entsprechende Einheitenbild besser vielleicht Imagelist, kann imagelist nur bmp ich brauch aber gif?
    Edit: TEdit;                  // Eingabefeld für Einheitenname
    Einheitenname: TStaticText;   // Anzeige des Einheitennamens
    X,Y: Integer;                 // Position der Einheit auf Karte Y
    Typ: String;                  // z.B. "Infantry", Image ist abhaengig vom Einheitentyp wo kann ich diese Abhaengigkeit berechnen oder festlegen z.B wenn Einheitentyp = 2  dann image.picture.'Panzer.bmp"
                                   //draggen ermoeglichen und draggingstatus

  published
    property Einheitentyp :String read Typ write Typ;
    property MapX :Integer read x write x;
    property MapY :Integer read y write y;

  public
    constructor Create(Owner: TComponent); override;
    destructor Destroy; override;


    { Public-Deklarationen }
  end;


var
  Form1: TForm1;
  mapobject1:tmapobject;
  implementation

{$R *.dfm}

constructor TMapObject.Create(Owner: TComponent);

begin
  Image := TImage.Create(Owner); // So muss das heißen
  Edit := TEdit.Create(Owner);
  Einheitenname := TStaticText.Create(Owner);
end;

destructor TMapObject.destroy;
begin
  edit.free;
  image.free;
  einheitenname.free
end;



procedure TForm1.FormClick(Sender: TObject);
begin
mapobject1:=Tmapobject.create(self);
//mapobject1.show;
mapobject1.einheitenname.Caption:='test';
mapobject1.einheitenname.show;
end;

end.

TStringlist 8. Mai 2005 17:05

Re: TEdit in Klasse ?
 
Hi, ich habe zwar nicht alle Einträge davor durchgelesen, aber ich würde sagen, im Constructor und Destructor fehlt noch jeweils ein "inherited"! Außerdem: TImage, TEdit und TStaticText brauchen nach ihrem Createn eine Zuweisung für ihre Parent-Property, ohne die sie sowieso nicht sichtbar werden können.

MfG

richard_boderich 8. Mai 2005 17:41

Re: TEdit in Klasse ?
 
Hallo TStringlist,

was meinst du mit Parent property in der delphi hilfe ist zwar ein haufen parentzeugs aber nix über parent property. Außerdem weis ich nicht was ich da für eine geerbte property angeben soll wenn Tmapobject das hoechste object in der hierarchie von Tmapobject ist. tmapobject ist von typ tcontrol. und dort gibt es eine
property visible, meinst du die ?

TStringlist 8. Mai 2005 17:58

Re: TEdit in Klasse ?
 
Mit Parent-Property meinte ich eigentlich nur diese ganz normale Property namens "Parent" ...und die muss bei jedem sichtbaren Control (welches dynamisch erzeugt wird) extra geladen werden ...und zwar mit selbst wieder einem sichtbaren Control auf dem dann eben dieses erste Control darauf auftauchen soll. Also vorausgesetzt, dein "Owner", den du da in der Parameterliste deines Constructors mit angibst, ist ein solches sichtbares Control (vielleicht sogar die Form selbst), dann könntest du z.B. auch dieses dieser besagten Parent-Property jeweils zuweisen:

Image := TImage.Create(Owner);
Image.Parent := TWinControl(Owner);
usw...

richard_boderich 8. Mai 2005 22:50

Re: TEdit in Klasse ?
 
Moin Jungs,

1. Also ich hab jetz eine objectlist eingefügt aber ich hab das problem das er nur das erste object
in die objectlist überträgt. hatt jemand ne ahnung wieso er das macht?

2. koennen objecte in einer objectlist den selben namen haben, sie haben doch unterschiedliche
handlesund einen index ,das muesste doch reichen oder? dann würde ich mir das dumme array of
tmapobject sparen. (ja ich weis bei mehr als 10 klicks gibst einen bereichsüberschreitung weil das array
statisch ist, habe es nur zu testzwecken auf die schnelle integriert)

3. wie kann ich auf das onkeydown ereignis des edits meines selbsterstellten objects zugreiffen,
muss ich da irgendwelche proceduren im create deklarieren.






Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, XPMan, StdCtrls, ComCtrls, Menus, ToolWin,
  Buttons, JvHtControls, JvGIF, ImgList, Contnrs;

type
  TForm1 = class(TForm)
    XPManifest1: TXPManifest;
    Label1: TLabel;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);


  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TMapObject = class(TControl)
  private
    image: TImage;                // Für das entsprechende Einheitenbild besser vielleicht Imagelist, kann imagelist nur bmp ich brauch aber gif?
    Edit: TEdit;                  // Eingabefeld für Einheitenname
    Einheitenname: TStaticText;   // Anzeige des Einheitennamens
    X,Y: Integer;                 // Position der Einheit auf Karte Y
    Typ: String;                  // z.B. "Infantry", Image ist abhaengig vom Einheitentyp wo kann ich diese Abhaengigkeit berechnen oder festlegen z.B wenn Einheitentyp = 2  dann image.picture.'Panzer.bmp"
                                   //draggen ermoeglichen und draggingstatus

  published
    property Einheitentyp :String read Typ write Typ;
    property MapX :Integer read x write x;
    property MapY :Integer read y write y;
  //  procedure zeichnen(Mapx,Mapy:integer);
  public
    constructor Create(Owner: TComponent); override;
    destructor Destroy; override;


    { Public-Deklarationen }
  end;





var
  Form1: TForm1;
  mapobject: array [1..10] of tmapobject;
  i,index:integer;
  Liste:TObjectList;
  implementation

{$R *.dfm}

constructor TMapObject.Create(Owner: TComponent);

begin
  Image := TImage.Create(Owner); // So muss das heißen
  image.Parent := TWinControl(owner);
  image.Picture.loadfromfile('marker_fadenkreuz.gif');
  image.transparent:=true;
  Edit := TEdit.Create(Owner);
  Edit.Parent := TWinControl(owner);
  edit.Left:=mapx+50;
  edit.Top:=mapy+25;
  edit.setfocus;
  Einheitenname := TStaticText.Create(owner);
  Einheitenname.Parent := TWinControl(owner);
end;

destructor TMapObject.destroy;
begin
  edit.free;
  image.free;
  einheitenname.free
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
mapobject[i]:=Tmapobject.Create(self);            //object erstellen (lächerlich nur um
                                                   //einen eindeutigen onjectnamen zu bekommen ?!
mapobject[i].mapx:=x;
mapobject[i].mapy:=y;
Liste := TObjectList.Create;                      //tobjectlist zuweisen
Liste.Add(mapobject[i]);
label1.caption:=inttostr(Liste.count);           //tur kontrolle
inc(i);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
i:=1;
end;

end.

Hansa 8. Mai 2005 23:17

Re: TEdit in Klasse ?
 
Wie siehts mit meinem Vorschlag (Stringgrid) denn aus ? Überhaupt gesehen ? Letzte Beiträge auf Seite werden oft übersehen. 8) Die meisten Fragen wären wohl überflüssig. Der Code ist IMHO jetzt schon viel zu gewaltig und unübersichtlich für den gewünschten Zweck.

richard_boderich 8. Mai 2005 23:38

Re: TEdit in Klasse ?
 
Moin Hansa,

Also ich habe deinen Beitrag nicht übersehen. ich kann nur nichts mit deinem Vorschlag anfangen. Ich
verstehe nicht wie mir ein Stringgrid bei meinem Problem helfen kann, bzw. ich denke einfach anders als du.

Ich wollte weiter nicht als ein object , das folgende bedingungen und funktionen kapselt:


1. enthaelt 1 Timage
2. enthaelt 2 Tedit
3. enthaelt 1 TStatictext
4. deklariert Variable Mapx,Mapy ->Integer;
5. deklariert Variable Einheitentyp ->String;


4. object ist zur laufzeit verschiebbar
object soll selbst image.left und image.top berechnen aus mapx und mapy (das object soll das selber tun)
5. object soll loeschbar sein

Ich bin kanpp davor aufzugeben. es kostet einfach zu viel zeit und nerven, zu viel neues der ganze Klassenkram , aber ich habs wenigstens versucht

Hau rein,

Richard

//EDIT das war mein code ohne die object implementierung

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, XPMan, StdCtrls, ComCtrls, Menus, ToolWin,
  Buttons, JvHtControls, JvGIF;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Timer1: TTimer;
    Panel2: TPanel;
    CoolBar1: TCoolBar;
    ComboBox1: TComboBox;
    BitBtn1: TBitBtn;
    StaticText1: TStaticText;
    XPManifest1: TXPManifest;
    Image2: TImage;
    StaticText2: TStaticText;
    Edit1: TEdit;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);


  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  dra,helper:boolean;
  terrorspeicherx,terrorspeichery,xx,yy,terrorx,terrory:Integer;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Dra=false then statictext1.Caption:='Map X: = '+inttostr(xx)+' '+'Map Y: = '+inttostr(yy);
if (mouse.cursorpos.x > form1.Left) and (mouse.cursorpos.x < form1.Left+form1.width) and
   (mouse.CursorPos.y>form1.Top) and (mouse.CursorPos.y < form1.top+form1.height) And (helper=true) then
   begin
   image1.left:=-terrorx+mouse.cursorpos.x-form1.left;
   image1.top:=-terrory+mouse.cursorpos.y-form1.top;
 // image2.left:=image1.Left+terrorx;
 // image2.top:=image1.Top+terrory;

   end
   else
   begin
    //exit;
   end;


if helper=false then
begin

if (mouse.cursorpos.x<form1.Left) and (image1.left<=30) then image1.left:=image1.left+15;
if (mouse.cursorpos.x>form1.Left+form1.width) and (image1.Left+image1.width>=form1.width-30) then image1.left:=image1.left-15;
if (mouse.cursorpos.y<form1.top) and (image1.top<=30) then image1.top:=image1.top+15;
if (mouse.cursorpos.y>form1.top+form1.height) and (image1.top+image1.height>=form1.height-59)then image1.top:=image1.top-15;
end;

   image2.left:=image1.left+terrorspeicherx;
   image2.top:= image1.top+terrorspeichery;  //with map move funktion
   statictext2.Left:= image1.left+terrorspeicherx+50;
   statictext2.top:= image1.top+terrorspeichery+18;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.DoubleBuffered:=true;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssright in shift then
  begin
  terrorx:=+x+4;
  terrory:=+y+30;
  helper:=true;
  dra:=true;
  end;

  if ssleft in shift then
  begin
  terrorspeicherx:=xx-5-image2.width div 2;
  terrorspeichery:=yy-image2.height-5;
   image2.left:=image1.left+terrorspeicherx;
   image2.top:=image1.top+terrorspeichery;
   edit1.Left:=image1.left+terrorspeicherx+50;
   edit1.Top:=image1.top+terrorspeichery+18;
   edit1.Visible:=true;
   edit1.setfocus;
  end;

end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
helper:=false;
dra:=false;
end;


procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
xx:=x+4;
yy:=y+30;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key=VK_RETURN then
begin
edit1.hide;
statictext2.Left:= image1.left+terrorspeicherx+50;
statictext2.top:= image1.top+terrorspeichery+18;
statictext2.caption:=' '+edit1.Text+' ';
statictext2.show;
end;
end;

end.

TStringlist 9. Mai 2005 07:36

Re: TEdit in Klasse ?
 
Moin

1.) fehlt in deinem Constructor immer noch das "inherited" am Anfang.

2.) sollten die Unterkomponenten für ihren eigenen Owner einfacherweise nur das "Self" mitbekommen. Der extra Destructor wird dann unnötig und kann rausfliegen, weil die Unterkomponenten dann nämlich automatisch mit der Komponente selbst destroyed werden (also dann, wenn die ja ihrerseits durch ihren eigenen Owner destroyed wird).

3.) musst du TObjectList in "FormCreate" createn (und dann wieder in "FormDestroy" free'n), sonst erzeugst du ja bei jedem MouseDown immer wieder eine neue ObjectListe ...und welche demzufolge dann natürlich auch jedesmal nur einen einzigen Eintrag groß werden kann.

Dann müsste es eigentlich gehn...


Sonst noch zu deiner obigen Frage2: Objekte in einer Objectlist haben keine Namen. Das dortige "items" (das in anderen Komponenten sonst oft eine TStringList ist) ist hier quasi nur eine Array of TObject, also ohnehin nur sowas wie eine Array of Pointer.

Zu deiner obigen Frage3: Du könntest z.B. im Rahmen deiner Komponente darin eine weitere Routine schreiben, also z.B.:

procedure TMapObject.EditMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
...
end;

und im Constructor dann folgendes eintragen:

Edit.OnMouseDown := EditMouseDown;


PS. Wenn du möchtest, dass das Objekt seine Koordinaten selbst berechnet, dann solltest du diesem die aktuelle Maus-Position zum Zeitpunkt seiner Erstellung am Besten auch gleich über dessen Constructor-Parameterliste mitteilen.

richard_boderich 9. Mai 2005 10:36

Re: TEdit in Klasse ?
 
Hallo TStringlist!

Erstmal hab vielen Dank für die vielen Hinweise und das du mich so unterstützt.
Ich weis es sehr zu schätzten das du die Zeit opfers und dich jedesmal durch meinen Quelltext wühlst. :)

Das mit der Liste stimmt, hab ich gestern selber noch rausgefunden, aber es ist gut das du mich
daraufhin weist das ich sie im Form.Destroy wieder freigeben muss. *uups* Ich habe das Project jetzt
mal so überarbeitet wie ich es mir vostelle. Habe auch Formatierung und Großschreibung hinzugefügt
(der Übersichtlichkeit wegen :wink: ) Leider bekomme ich die Übergabe meiner Constructor Parameter nicht
hin. :gruebel: :stupid:

In der OH steht:

Zitat:

Die Deklaration gleicht einer normalen Prozedurdeklaration, beginnt aber mit dem Wort constructor.
Auch unter "Aufrufkonventionen von Constructoren" schweigt sich die OH aus , wie ich dort Parameter übergebe

Ansonsten hab ich alles brav so gemacht wie du es mir empfohlen hast. :zwinker:

Bis denne,

Richard

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, XPMan, StdCtrls, ComCtrls, Menus, ToolWin,
  Buttons, JvHtControls, JvGIF, ImgList, Contnrs;

type
  TForm1 = class(TForm)
    XPManifest1: TXPManifest;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TMapObject = class(TControl)
  private
    image: TImage;                // Für das entsprechende Einheitenbild besser vielleicht Imagelist, kann imagelist nur bmp ich brauch aber gif?
    Edit: TEdit;                  // Eingabefeld für Einheitenname
    Einheitenname: TStaticText;   // Anzeige des Einheitennamens
    X,Y: Integer;                 // Position der Einheit auf Karte Y
    Typ: String;                  // z.B. "Infantry", Image ist abhaengig vom Einheitentyp wo kann ich diese Abhaengigkeit berechnen oder festlegen z.B wenn Einheitentyp = 2  dann image.picture.'Panzer.bmp"
                                   //draggen ermoeglichen und draggingstatus
  published
    property Einheitentyp :String read Typ write Typ;
    property MapX :Integer read x write x;
    property MapY :Integer read y write y;
  //  procedure zeichnen(Mapx,Mapy:integer);
  public
    constructor Create(Owner: TComponent; MapX: Integer; MapY: Integer); override;
       { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  mapobject:tmapobject;
  i,index:integer;
  Liste:TObjectList;
  implementation

{$R *.dfm}

constructor TMapObject.Create(Owner: TComponent; MapX: Integer; MapY: Integer);
begin
  inherited;
    Image := TImage.Create(self); // So muss das heißen
    Image.Parent := TWinControl(owner);
    Image.Picture.loadfromfile('marker_fadenkreuz.gif');
    Image.Transparent:=true;
    Image.Left:=mapx;
    Image.Top:=mapy;
      Edit := TEdit.Create(self);
      Edit.Parent := TWinControl(owner);
      Edit.Left:=MapX+50;          // Positionberechnung
      Edit.Top:=mapy+25;           //
      Edit.SetFocus;
    Einheitenname := TStaticText.Create(self);
    Einheitenname.Parent := TWinControl(owner);
end;


procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MapObject:=TMapObject.Create(self,X,Y);            //object erstellen
  Liste.add(MapObject);
  Label1.caption:=inttostr(Liste.count);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Liste := TObjectList.create;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
Liste.free;
end;

end.

Jens Schumann 9. Mai 2005 11:26

Re: TEdit in Klasse ?
 
Hallo,
versuch es mal so
Delphi-Quellcode:
constructor Create(Owner: TComponent; MapX: Integer; MapY: Integer); reintroduce; virtual;

constructor TMapObject.Create(Owner: TComponent; MapX, MapY: Integer);
begin
  inherited Create(Owner);
  ...
end;

richard_boderich 9. Mai 2005 11:36

Re: TEdit in Klasse ?
 
Danke Jens, jetz funzt es wunderbar und es kommen auch keine Compiler Fehlermeldungen mehr. :)

So long,

der Richard

TStringlist 9. Mai 2005 12:16

Re: TEdit in Klasse ?
 
Zitat:

Zitat von richard_boderich
Leider bekomme ich die Übergabe meiner Constructor Parameter nicht
hin.

Echt Käse *g*, da hast du dir auch schon genau den Punkt rausgesucht, wo ich vorhin etwas geschlampt habe, und den ich jetzt eigentlich gerade per "Edit" im Post schnell noch ändern wollte *ggg*. Das im Constructor zu machen, ist nämlich bei deinen Anforderungen eher etwas unsinnig, denn (wie du ja oben schon kurz erwähnt hast) das Object soll ja zur Laufzeit verschiebbar sein, und zwar dann wahrscheinlich auch immer mal wieder, je nach dann auch immer wieder neu übergebenen MapX- u. MapY-Werten. Und da du MapX- u. MapY klugerweise dann auch gleich schon als Property formuliert hast, ist es daher also das logischste, hier einfach nur noch mehr eine zu diesen Properties jeweils dazu mögliche Set-Procedure mitzudefinieren. Dort kannst du dann also auch alle event. Left- u. Top-Werte gleich immer wieder neu mitberechnen.

Sofern du dich da noch nicht richtig eingearbeitet haben solltest, sähe das Ganze dann also ungefähr so aus:


Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, XPMan, StdCtrls, ComCtrls, Menus, ToolWin,
  Buttons, ImgList, Contnrs;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    XPManifest1: TXPManifest;
    Edit1: TEdit;


    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);


  private
    { Private-Deklarationen } 
  public
    { Public-Deklarationen } 
  end;

  TMapObject = class(TControl)
  private
    image: TImage;                // Für das entsprechende Einheitenbild besser vielleicht Imagelist, kann imagelist nur bmp ich brauch aber gif? 
    Edit: TEdit;                  // Eingabefeld für Einheitenname
    Einheitenname: TStaticText;   // Anzeige des Einheitennamens
    X,Y: Integer;                 // Position der Einheit auf Karte Y
    Typ: String;                  // z.B. "Infantry", Image ist abhaengig vom Einheitentyp wo kann ich diese Abhaengigkeit berechnen oder festlegen z.B wenn Einheitentyp = 2  dann image.picture.'Panzer.bmp"
                                   //draggen ermoeglichen und draggingstatus

    procedure SetX(Value : integer);
    procedure SetY(Value : integer);
    procedure EditMouseDown(Sender: TObject; Button: TMouseButton;
              Shift: TShiftState; X, Y: Integer);
  published
    property Einheitentyp :String read Typ write Typ;
    property MapX :Integer read X write SetX;
    property MapY :Integer read Y write SetY;

  public
    constructor Create(Owner: TComponent); override;
    { Public-Deklarationen }
  end;


var
  Form1: TForm1;
  mapobject: array [1..10] of tmapobject;
  i,index:integer;
  Liste:TObjectList;
  implementation

{$R *.dfm} 


constructor TMapObject.Create(Owner: TComponent);
begin
  inherited;
  Image := TImage.Create(self); // So muss das heißen
  image.Parent := TWinControl(owner);
  image.Picture.loadfromfile('geld.bmp');
  image.transparent:=true;
  Edit := TEdit.Create(self);
  Edit.Parent := TWinControl(owner);
  edit.Left:=mapx+50;
  edit.Top:=mapy+25;
  edit.setfocus;
  Einheitenname := TStaticText.Create(self);
  Einheitenname.Parent := TWinControl(owner);
  Edit.OnMouseDown := EditMouseDown;
end;


procedure TMapObject.SetX(Value : integer);
begin
  Image.Left := Value;
  Edit.Left := Value;
end;

procedure TMapObject.SetY(Value : integer);
begin
  Image.Top := Value;
  Edit.Top := Value;
end;

procedure TMapObject.EditMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  beep;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
mapobject[i]:=Tmapobject.Create(self);            //object erstellen (lächerlich nur um
                                                   //einen eindeutigen onjectnamen zu bekommen ?! 
mapobject[i].mapx:=x;
mapobject[i].mapy:=y;

Liste.Add(mapobject[i]);
label1.caption:=inttostr(Liste.count);           //tur kontrolle
inc(i);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Liste := TObjectList.Create;                      //tobjectlist zuweisen
  i:=1;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Liste.free;
end;

end.

richard_boderich 9. Mai 2005 12:30

Re: TEdit in Klasse ?
 
So Jungs,


@TStringlist, oh man jetz verwirst du mich wieder. Wozu den eine setprocedure, ich kann auf Mapx, MapY doch schon schreibend zugreifen, so habe ich sie doch in der Klasse deklariert? oder ist das nicht so?


habe jetz die Komponente etwas umgestaltet, Einheitenabhängikeit im Constructor hinzugefügt, und
ein Timage auf dem Form eingefügt, das die Karte als Jpeg beinhaltet. Dies Sache mit den Einheiten
funktioniert gut, aber ich bekomme ja die Mauscoordinaten jetz nicht mehr im Form.onmousedown sondern
im Timage1.onmousedown. Das klappt auch, nur zeichnet er mein object relativ zum Form1.left / Form1.top und
nicht zu Image1.Left / image1.top. muss ich da den owner veraendern?

PS: das Image ist größer als das Form, und das soll auch so bleiben

So long,

Richard

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, XPMan, StdCtrls, ComCtrls, Menus, ToolWin,
  Buttons, JvHtControls, JvGIF, ImgList, Contnrs;

type
  TForm1 = class(TForm)
    XPManifest1: TXPManifest;
    Label1: TLabel;
    Label2: TLabel;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TMapObject = class(TControl)
  private
    image: TImage;                // Für das entsprechende Einheitenbild besser vielleicht Imagelist, kann imagelist nur bmp ich brauch aber gif?
    Edit: TEdit;                  // Eingabefeld für Einheitenname
    Einheitenname: TStaticText;   // Anzeige des Einheitennamens
    X,Y: Integer;                 // Position der Einheit auf Karte Y
    Typ: String;                  // z.B. "Infantry", Image ist abhaengig vom Einheitentyp wo kann ich diese Abhaengigkeit berechnen oder festlegen z.B wenn Einheitentyp = 2  dann image.picture.'Panzer.bmp"
                                   //draggen ermoeglichen und draggingstatus
  published
    property Einheitentyp :String read Typ write Typ;
    property MapX :Integer read x write x;
    property MapY :Integer read y write y;
  //  procedure zeichnen(Mapx,Mapy:integer);
  public
    constructor Create(Owner: TComponent; MapX: Integer; MapY: Integer; Einheitentyp: String); reintroduce; virtual;
       { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  mapobject:tmapobject;
  i,index:integer;
  Liste:TObjectList;
  implementation

{$R *.dfm}

constructor TMapObject.Create(Owner: TComponent; MapX: Integer; MapY: Integer; Einheitentyp:String);
begin
  //inherited;
    Image := TImage.Create(self); // So muss das heißen
    Image.Parent := TWinControl(owner);
    if Einheitentyp = 'Panzer' then Image.Picture.loadfromfile('marker_fadenkreuz.gif');
    if Einheitentyp = 'test' then Image.Picture.loadfromfile('unbenannt-3.gif');
    Image.Transparent:=true;
    Image.Left:=mapx;
    Image.Top:=mapy;
      Edit := TEdit.Create(self);
      Edit.Parent := TWinControl(owner);
      Edit.Left:=MapX+50;          // Positionberechnung
      Edit.Top:=mapy+25;           //
      Edit.SetFocus;
    Einheitenname := TStaticText.Create(self);
    Einheitenname.Parent := TWinControl(owner);
end;


procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MapObject:=TMapObject.Create(self,X,Y,'test');            //object erstellen
  Liste.add(MapObject);
  Label1.caption:=inttostr(Liste.count);
  Label2.Caption:=inttostr(x)+' , '+inttostr(y);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Liste := TObjectList.create;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
Liste.free;
end;



end.

TStringlist 9. Mai 2005 13:19

Re: TEdit in Klasse ?
 
Zitat:

Zitat von richard_boderich
Wozu den eine setprocedure, ich kann auf Mapx, MapY doch schon schreibend zugreifen, so habe ich sie doch in der Klasse deklariert? oder ist das nicht so?

Natürlich kannst du auf MapX und MapY schreibend zugreifen, aber du willst doch durch dieses Laden dieser MapX- u. MapY-Größen dann dabei auch immer gleichzeitig noch die Left-Top-Koordinaten deiner ganzen weiteren Komponente (bzw. ihrer event. vielen Unterkomponenten) mit festlegen. Und mittels dieser Property- (Set-) Procedures kannst du das dann eben auch immer gleich automatisch miterledigen lassen. Auch zu beliebig vielen späteren Zeitpunkten, während das Programm dann schon läuft. Alles was dann immer nur noch mehr nötig ist, ist bloß eine einfache Wertezuweisung auf eine solche Property-Größe und in dieser besagten Property-Procedure wird dann jedesmal ein von dir dort mit reingeschriebener Code die dann jeweils weiteren Left/Top-Werte der Unterkomponenten mitberechnen.

richard_boderich 10. Mai 2005 13:19

Re: TEdit in Klasse ?
 
Hallo allerseits!

Also ich hab das ganze etwas erweitert. Ein neues Mapobject kann jetzt nur erstellt werden , wenn für das aktuelle ein
Name vergeben wird. Habe dblclick Procedure eingefügt, damit ein spaeteres umbenennen moeglich ist. Doppelklick auf
das einheitenimage oder das einheitenlabel bewirkt dies.

@ Tstringlist, das mit der Setprocedure ist mir jetz klar, den meine berechnung steht zwar im construktor drin, wird
aber dann auch nur verwendet bei erstellen des Objects und nicht bei anderen aktionen mit dem bestehenden onject? Habe ich das
richtig verstanden?

Habe schon wieder ein neues Problem. Nehmen wir an ich habe 3 MapObjecte erstellt, moechte aber beim anklicken des einheiten images von einem der 3 eine weitere verarbeitung nur dieses 1 objectes ermoeglichen. Habe mit Findcomponent experimentiert
aber nur exeptions gekriegt. hatt den das object keinen eindeutigen bezeichner anhand dessen man es waerend der laufzeit
und auch spaeter in der TObjectlist identifizieren kann? (Listindex muss ermittelt werden);

waere toll wenn jemand einen hinweis hat. Mein aktueller Code ist im anhang


PS: Nochmals vielen Dank an Stringlist, Jens und Hansa für die viele Nachsicht und Gedult mit mir. :zwinker: :cheers:


Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, XPMan, StdCtrls, ComCtrls, Menus, ToolWin,
  Buttons, Contnrs, JvGIF, JvComponent, JvRollOut;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Panel2: TPanel;
    CoolBar1: TCoolBar;
    ComboBox1: TComboBox;
    BitBtn1: TBitBtn;
    StaticText1: TStaticText;
    Panel1: TPanel;
    JvRollout1: TJvRollout;
    Image2: TImage;
    CoolBar2: TCoolBar;
    Panel3: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Bevel1: TBevel;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Panel4: TPanel;
    Button12: TButton;
    Button13: TButton;
    Button14: TButton;
    Button15: TButton;
    Button16: TButton;
    Button17: TButton;
    Button11: TButton;
    Panel5: TPanel;
    Button18: TButton;
    Button19: TButton;
    Button20: TButton;
    Button21: TButton;
    Button22: TButton;
    Button23: TButton;
    Button24: TButton;
    Button25: TButton;
    Image3: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TMapObject = class(TControl)
  private
    image: TImage;                // Für das entsprechende Einheitenbild besser vielleicht Imagelist, kann imagelist nur bmp ich brauch aber gif?
    Edit: TEdit;                  // Eingabefeld für Einheitenname
    Einheitenname: TStaticText;   // Anzeige des Einheitennamens
    X,Y: Integer;                 // Position der Einheit auf Karte Y
    Typ: String;                  // z.B. "Infantry", Image ist abhaengig vom Einheitentyp wo kann ich diese Abhaengigkeit berechnen oder festlegen z.B wenn Einheitentyp = 2  dann image.picture.'Panzer.bmp"
                                   //draggen ermoeglichen und draggingstatus

    procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure DblClick(Sender: TObject); reintroduce; virtual;

  published
    property Einheitentyp :String read Typ write Typ;
    property MapX :Integer read x write x;
    property MapY :Integer read y write y;
  //  procedure zeichnen(Mapx,Mapy:integer);
  public
    constructor Create(Owner: TComponent; MapX: Integer; MapY: Integer; Einheitentyp: String); reintroduce; virtual;
       { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  mapobject:tmapobject;
  i,index:integer;
  Liste:TObjectList;
  implementation

{$R *.dfm}

constructor TMapObject.Create(Owner: TComponent; MapX: Integer; MapY: Integer; Einheitentyp:String);
begin
  //inherited;
    Image := TImage.Create(self); // So muss das heißen
    Image.Left:=mapx;
    Image.Top:=mapy;
    image.autosize:=true;
    Image.Transparent:=true;
    if Einheitentyp = 'Panzer' then Image.Picture:=Form1.image3.picture;
    if Einheitentyp = 'test' then Image.Picture.loadfromfile('unbenannt-3.gif');
    Image.Parent := TWinControl(owner);

      Edit := TEdit.Create(self);
      Edit.Left:=MapX+50;          // Positionberechnung
      Edit.Top:=mapy+25;           //
      Edit.Parent := TWinControl(owner);
      Edit.SetFocus;

    Einheitenname := TStaticText.Create(self);
    Einheitenname.Left:=mapx+50;
    Einheitenname.Top:=mapy+25;
    Einheitenname.Height:= 20;
    Einheitenname.BevelInner:= bvLowered;
    Einheitenname.BevelKind:= bkSoft;
    Einheitenname.BevelOuter:= bvRaised;
    Einheitenname.Font.Charset:= DEFAULT_CHARSET;
    Einheitenname.Font.Color:= clWindowText;
    Einheitenname.Font.Height:= -13;
    Einheitenname.Font.Name:= 'MS Sans Serif';
    Einheitenname.Font.Style:= [fsBold];
    Einheitenname.ParentFont:= False;
    Einheitenname.TabOrder:= 1;
    Einheitenname.Transparent:= False;
    Einheitenname.Visible:= False;
    Einheitenname.Parent := TWinControl(owner);

    Edit.OnKeyDown := EditKeyDown;
    Image.OnDblClick:=Dblclick;
    Einheitenname.OnDblClick:=DblClick;
end;


procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);

Const NamePrefix='Mapobject';

begin
  if ssleft in shift then
  begin
    TMapObject.Create(self,X,Y,'Panzer').Name := NamePrefix+inttostr(i);            //object erstellen
    Liste.add(MapObject);
    Label1.caption:=inttostr(Liste.count);
    Label2.Caption:=inttostr(x)+' , '+inttostr(y);
    Form1.Image1.OnMouseDown:=nil;
  end;
end;


procedure tmapobject.DblClick(Sender: TObject);
begin
Form1.Image1.OnMouseDown:=nil;
Einheitenname.Hide;
Edit.show;
Edit.SetFocus;
end;


procedure TMapObject.EditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key=VK_Return) And (edit.text<>'') then
  begin
  Einheitenname.caption:=' '+edit.text+' ';
  Edit.Hide;
  Einheitenname.Show;
  Form1.Image1.OnMouseDown:=form1.image1MouseDown;
  end;

  if (Key=VK_Return) And (edit.text='') then
  begin
    form1.Label1.caption:='Fehler Sie muessen einen Namen Vergeben!';
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  form1.DoubleBuffered:=true;
  Statictext1.doublebuffered:=true;
  Liste := TObjectList.create;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
Liste.free;
end;


procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
form1.StaticText1.caption:='Map X = '+inttostr(x)+' Map Y = '+inttostr(y);
end;

end.

Kroko1999 10. Mai 2005 13:22

Re: TEdit in Klasse ?
 
nutze die Eigenschaft Tag aus um die Maps zu unterscheiden

Khabarakh 10. Mai 2005 13:33

Re: TEdit in Klasse ?
 
Eigentlich sollte doch der Index in der Liste zur Unterscheidung reichen.

richard_boderich 10. Mai 2005 13:41

Re: TEdit in Klasse ?
 
@Khabarakh

und was ist wenn ich eine object aus der mittendrin in der liste loesche, dann verschiebt sich der indexvon allen anderen
objecten oder wie ?

Khabarakh 10. Mai 2005 14:08

Re: TEdit in Klasse ?
 
Ich gebe es zu, ich habe den Überblick über das Programm verloren :oops: .
Wann musst du ein Objekt identifizieren?

TStringlist 10. Mai 2005 14:11

Re: TEdit in Klasse ?
 
Zitat:

Zitat von richard_boderich
@ Tstringlist, das mit der Setprocedure ist mir jetz klar, den meine berechnung steht zwar im construktor drin, wird
aber dann auch nur verwendet bei erstellen des Objects und nicht bei anderen aktionen mit dem bestehenden onject? Habe ich das
richtig verstanden?

Wenn du die Left/Top-Koordinaten des Objektes nur einmal (beim Erstellen) benötigst, reicht eine einmalige Aktion im Constructor natürlich aus. Nur mir fiel dann noch ein, dass du irgendwo vorher ja als Bedingung noch extra schriebst: "4. object ist zur laufzeit verschiebbar". Außerdem, solche Picture-Files namens "Panzer.bmp" und "Fadenkreuz.gif" suggerieren da auch diesbezüglich noch zusätzlich viel Bewegung in deinem Prog. *g*

Übrigens dürfte da auch noch ein Fehler in "Image1MouseDown" sein. Wenn du da den TMapObject-Constructor (Create) aufrufst, dann bekommst du auch sofort einen Pointer auf das dadurch erzeugte Objekt zurück, ...welchen du also noch in der gleichen Anweisung in die Objekt-Liste zu laden hast, oder davor noch in eine andere Variable zwischenspeichern musst.

Dabei könntest du irgendeinem dieser da erzeugten Objekte dann auch gleich noch einen eindeutigen Namen geben (wenn's dafür irgendeinen besonderen Grund gäbe), indem du dessen Pointer dann z.B. einer solchen extra dafür definierten TmapObject-Variablen zuweist, also in etwa so:

Delphi-Quellcode:
var
  KommandoPanzer : TMapObject
  .
  .
  .

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);

Const NamePrefix='Mapobject';
var AMapObject : TMapObject;

begin
  if ssleft in shift then
  begin
    AMapObject := TMapObject.Create(self,X,Y,'Panzer').Name := NamePrefix+inttostr(i);            //object erstellen
    Liste.add(AMapObject);
    if bla = blabla then KommandoPanzer := AMapObject;
    ...
  end;
end;

richard_boderich 10. Mai 2005 14:45

Re: TEdit in Klasse ?
 
@bei einem klick auf das einheiten image. eingentlich wollt ich das so haben , das ich mit der maus über das Einheitenbild
fahre und dann mit druck auf taste "entf" loeschen kann. aber da ich noch object und klassenneuling bin ist mir das zu hoch.

@TStringlist
bitte schau dir mal folgende Procedure an, so wollt ich das loesen. aber ich hab immer ne exeption bekommen und sehe nicht warum . lass die Liste erstmal beiseite , die brauch ich erst spaeter für die netzwerksyncronisation. nehmen wir mal ich
habe 3 Mapobjecte erstellt. dann sollten diese objecte die namen Mapobject1,mapobject2 und mapobject3 haben. warum zum
Teufel kann ich sie dann aber nicht über diesen bezeichner ansprechen???

Delphi-Quellcode:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);

Const NamePrefix='Mapobject';

begin
  if ssleft in shift then
  begin
    TMapObject.Create(self,X,Y,'Panzer').Name := NamePrefix+inttostr(i);  //bei jedem aufruf eindeutiger objectname erteilt
    Liste.add(MapObject);
    Label1.caption:=inttostr(Liste.count);
    Label2.Caption:=inttostr(x)+' , '+inttostr(y);
    Form1.Image1.OnMouseDown:=nil;
    inc(i) //i:=globale variable im form create auf 1 gesetzt!
  end;
end;


// so hatte ich mir das gedacht , im onklick von einheitenimage, anzeige von Einheitenname auf objectname setzten (zum Test)

TMapObject.imageclick(Sender: TObject);
begin
  einteitenname.caption:=FindComponent(NamePrefix + IntToStr(i)).name;  // exeption bei klick auf einheitenbild, warum ???
  //meinetwegen auch mapobjectx.destroy   oder  auch Mapobject+Inttostr(i).destroy  // immer ne exeption
                              ^
end;             // hier ist mein Problem //

TStringlist 10. Mai 2005 15:30

Re: TEdit in Klasse ?
 
Der Fehler müsste darin liegen, dass FindComponent dort nie ein positives Suchergebnis erzielen kann und deswegen dann also auch immer mit dem Ergebnis NIL zurückkommt ...und von diesem quasi mit NIL gepointeten Objekt versuchst du dann die Property "Name" zu lesen, Folge: Eine Exception! Warum kommt FindComponent da immer mit einem NIL zurück? Weil im Zusammenbau des Suchnamens das IntToStr(i) drin ist und du dieses "i" aber am Ende von Image1MouseDown schon immer gleich um eins erhöhst, dh. also: du hast Komponentname erzeugt die so lauten: "MapObject0", "MapObject1" und "MapObject2". Und suchen tust du dann aber immer nach einem "MapObject3".

Khabarakh 10. Mai 2005 15:32

Re: TEdit in Klasse ?
 
Delphi-Quellcode:
 TMapObject.Create(self,X,Y,'Panzer').Name := NamePrefix+inttostr(i);  //bei jedem aufruf eindeutiger objectname erteilt
    Liste.add(MapObject);
Hier weist du MapObject die neue Instanz gar nicht zu. Oder nur verschrieben?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:19 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz