Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

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)

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 22:14 Uhr.
Seite 4 von 5   « Erste     234 5      

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