![]() |
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:
Ist sowas überhaupt realisierbar oder muss ich dafür eine Komponente erstellen?
Label1.caption:=Klasse.edit1.text;
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 |
Re: TEdit in Klasse ?
Klar geht das.
Zitat:
|
Re: TEdit in Klasse ?
Naja, du kannst das Edit als Unterobjekt definieren, z.B. so:
Delphi-Quellcode:
Dann kannst du imho normal auf das Edit zugreigen (Instanz.Edit1.Text usw.)
TMyCFlass = class
published Edit1: TEdit; end; 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: |
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; |
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 :? |
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:
ICh hoffe du verstehts jetzt mein Problem.Panzer[x].left:=20; So long Richard |
Re: TEdit in Klasse ?
Zitat:
|
Re: TEdit in Klasse ?
@Hansa,
^^ hab es oben mal genauer versucht zu erklaeren. hoffe es ist verstaendlich. Richard |
Re: TEdit in Klasse ?
@Hansa,
kann ich da nicht einfach (sender:Tobject) abfragen? |
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 ? |
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. |
Re: TEdit in Klasse ?
Hai Richard,
Du musst die Objekte in deiner Klasse erst "Createn". Schreibe Dir also einen eignen ![]() ![]() 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? |
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:
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.
LoadFromFile (MeinImageObject.Filename)
|
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. |
Re: TEdit in Klasse ?
Zitat:
|
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 |
Re: TEdit in Klasse ?
Würde es denn nicht reichen, ein Edit auf der Form für alle Objekte zu nehmen?
|
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. |
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 |
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 ? |
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. |
Re: TEdit in Klasse ?
Zitat:
|
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. |
Re: TEdit in Klasse ?
nutze die Eigenschaft Tag aus um die Maps zu unterscheiden
|
Re: TEdit in Klasse ?
Eigentlich sollte doch der Index in der Liste zur Unterscheidung reichen.
|
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 ? |
Re: TEdit in Klasse ?
Ich gebe es zu, ich habe den Überblick über das Programm verloren :oops: .
Wann musst du ein Objekt identifizieren? |
Re: TEdit in Klasse ?
Zitat:
Ü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; |
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 // |
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".
|
Re: TEdit in Klasse ?
Delphi-Quellcode:
Hier weist du MapObject die neue Instanz gar nicht zu. Oder nur verschrieben?
TMapObject.Create(self,X,Y,'Panzer').Name := NamePrefix+inttostr(i); //bei jedem aufruf eindeutiger objectname erteilt
Liste.add(MapObject); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:19 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