![]() |
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... |
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. |
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.
|
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. |
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. |
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:
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. |
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; |
Re: TEdit in Klasse ?
Danke Jens, jetz funzt es wunderbar und es kommen auch keine Compiler Fehlermeldungen mehr. :)
So long, der Richard |
Re: TEdit in Klasse ?
Zitat:
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. |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:11 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-2025 by Thomas Breitkreuz