![]() |
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 22:14 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