AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TEdit in Klasse ?

Ein Thema von richard_boderich · begonnen am 7. Mai 2005 · letzter Beitrag vom 10. Mai 2005
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#31

Re: TEdit in Klasse ?

  Alt 9. Mai 2005, 13:19
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.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#32

Re: TEdit in Klasse ?

  Alt 10. Mai 2005, 13:19
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.


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 = 'Panzerthen Image.Picture:=Form1.image3.picture;
    if Einheitentyp = 'testthen 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.
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#33

Re: TEdit in Klasse ?

  Alt 10. Mai 2005, 13:22
nutze die Eigenschaft Tag aus um die Maps zu unterscheiden
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#34

Re: TEdit in Klasse ?

  Alt 10. Mai 2005, 13:33
Eigentlich sollte doch der Index in der Liste zur Unterscheidung reichen.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#35

Re: TEdit in Klasse ?

  Alt 10. Mai 2005, 13:41
@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 ?
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#36

Re: TEdit in Klasse ?

  Alt 10. Mai 2005, 14:08
Ich gebe es zu, ich habe den Überblick über das Programm verloren .
Wann musst du ein Objekt identifizieren?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#37

Re: TEdit in Klasse ?

  Alt 10. Mai 2005, 14:11
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;
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#38

Re: TEdit in Klasse ?

  Alt 10. Mai 2005, 14:45
@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 //
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#39

Re: TEdit in Klasse ?

  Alt 10. Mai 2005, 15:30
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".
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#40

Re: TEdit in Klasse ?

  Alt 10. Mai 2005, 15:32
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?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz