Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array im Prozedurnamen ansprechen (https://www.delphipraxis.net/136713-array-im-prozedurnamen-ansprechen.html)

Zenny90 6. Jul 2009 19:44


Array im Prozedurnamen ansprechen
 
halli hallo,

ich hab vor nich allzu langer zeit mit delphi angefangen. trotz vorkenntnisse in andern sprachen hab ich auch auf delphitreff die anfangstutorials gemacht. ich steh nun aber einem problem gegnüber, dem ich auch nach 2 tägiger suche in google und stöbern in der hilfe nicht abhelfen konnte.

zur aufklärung:
ich möchte ein kartenspiel programmieren. dazu habe ich unter anderem ein array von Timage erzeugt. je nach bedarf wird während der laufzeit das array belegt und das bild angezeigt.
problem ist nun folgendes. wenn ich über delphi (diese schaltflächen oben) ein image einfügen lasse kann ich ja die prozedur TForm3.Image1MouseDown benutzen. da es aber nötig ist (aufgrund von redundanz, dateninkonsistenz, übersichtlichkeit und weniger programmierarbeiten) das array zu benutzen stell ich mir die frage: wie spreche ich das array an? ich habe einige varianten ausprobiert, wie zbsp TForm1.ArrayBild[k]MouseDown oder TForm1.ArrayBild[k].MouseDown ... usw.

bitte um hilfe

mfg Zenny

SirThornberry 6. Jul 2009 19:56

Re: Array im Prozedurnamen ansprechen
 
Um ehrlich zu sein habe ich (und vermutlich einige andere) dein Problem noch nicht verstanden. Was genau hast du vor? Warum hast du Procedure-namen in ein array gepackt und wie liegen diese in dem Array vor? als Strings? Am besten schilderst du was dein Ziel ist, ich denke dann können wir dir einige Vorschläge machen wie man da hinn kommt.

Klaus01 6. Jul 2009 20:19

Re: Array im Prozedurnamen ansprechen
 
Guten Abend,

lade doch nur die Bilder (jpg, bmp) in das Array
und lade es bei Bedarf in ein TImage (das kannst Du dann zur
Designzeit auf das Formular packen).

Alternativ zu dem Array mit Bilder kannst Du natürlich auch eine ImageList
benutzen. Aber auch die Bilder aus einer ImageList müssen in ein TImage geladen
werden.

Grüße
Klaus

jfheins 6. Jul 2009 20:42

Re: Array im Prozedurnamen ansprechen
 
Zitat:

Zitat von SirThornberry
Um ehrlich zu sein habe ich (und vermutlich einige andere) dein Problem noch nicht verstanden. Was genau hast du vor? Warum hast du Procedure-namen in ein array gepackt und wie liegen diese in dem Array vor? als Strings? Am besten schilderst du was dein Ziel ist, ich denke dann können wir dir einige Vorschläge machen wie man da hinn kommt.

Er hat ein array of TImage und möchte zur Laufzeit Events zuweisen ;)

Das geht iirc so:
Delphi-Quellcode:
Imagearr[4].OnClick := ImageOnClick;

procedure TForm1.ImageOnClick(Sender: Object)
begin
// ...
end;

Apollonius 6. Jul 2009 20:50

Re: Array im Prozedurnamen ansprechen
 
Eindeutig zu viel mit .NET gearbeitet, Julius. :mrgreen: In Delphi heißt das noch TObject.

xZise 6. Jul 2009 21:06

Re: Array im Prozedurnamen ansprechen
 
Zitat:

Zitat von jfheins
Zitat:

Zitat von SirThornberry
Um ehrlich zu sein habe ich (und vermutlich einige andere) dein Problem noch nicht verstanden. Was genau hast du vor? Warum hast du Procedure-namen in ein array gepackt und wie liegen diese in dem Array vor? als Strings? Am besten schilderst du was dein Ziel ist, ich denke dann können wir dir einige Vorschläge machen wie man da hinn kommt.

Er hat ein array of TImage und möchte zur Laufzeit Events zuweisen ;)

Würde ich auch sagen. Und so wie das Julius gelöst hat, ist es zur hälfte richtig ;)

Wichtig ist, dass die Eigenschaft du du suchst "OnMouseDown" heißt. (In der Regel sind solche "Ereignisse" immer mit einem "On" versehen)

MfG
xZise

jfheins 6. Jul 2009 21:38

Re: Array im Prozedurnamen ansprechen
 
Zitat:

Zitat von Apollonius
Eindeutig zu viel mit .NET gearbeitet, Julius. :mrgreen: In Delphi heißt das noch TObject.

Ihhhh ... was für eine rückständige Sprache :mrgreen:
Zitat:

Zitat von xZise
Würde ich auch sagen. Und so wie das Julius gelöst hat, ist es zur hälfte richtig ;)

Wichtig ist, dass die Eigenschaft du du suchst "OnMouseDown" heißt. (In der Regel sind solche "Ereignisse" immer mit einem "On" versehen)

Okay, die Parameter fürs OnMouseDown wusste ich grad nimmer, da hab' ich's halt am OnClick demonstriert :stupid:

Wichtig ist, dass die Methode die man zuweist auch genau die richtigen Parameter hat. Und die Property, der man das dann zuweisen muss, fängt im Normfall mit On... an - also OnMouseMove oder OnKeyPress.

Zenny90 6. Jul 2009 21:51

Re: Array im Prozedurnamen ansprechen
 
ersteinmal find ich es super wie schnell ihr geantwortet habt und einem hier versucht wird zu helfen. habs in andern beiträgen hier schon oft gelesen, aber in so kurzer zeit so viel. :)

ich weiß leider nicht wirklich wo ich die zeile "Imagearr[4].OnClick := ImageOnClick;" hinsetzten soll. hab zwar n bisl versucht die ma an alle erdenklichen stellen im cod ezu setzten aber nix geht. ich muss ja irgendwas unversucht gelassen haben dann

für die, die mein problem noch nicht ganz verstehen werd ich jetzt mal den code einfügen:

Delphi-Quellcode:
unit FensterDeckbuilder;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, IniFiles, jpeg;

type
  TForm3 = class(TForm)
    ButtonBeenden: TButton;
    Label1: TLabel;
    Image1: TImage;
    Button1: TButton;
    procedure ButtonBeendenClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure DefineKarte;
    procedure NeueKarte;
    procedure MouseOverKarte;
    procedure ImageOnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;  
  ini: TIniFile;    
  JPEG: TJpegImage;
  BMP:TBitmap;
  MouseStartPos : TPoint;
  Down : Boolean = False;
  MousOverKarte: Boolean = False;
  xdifferenz, ydifferenz: integer;
  xpos: integer = 200;
  ypos: integer = 100;
  breite: integer = 100;
  k: integer = 0;
  maxKarten: integer = 120;
  ArrayExist: array of Boolean;
  ArrayBild: array of TImage;
  ArrayBildx: array of integer;
  ArrayBildy: array of integer;

implementation

{$R *.dfm}

procedure TForm3.ImageOnClick(Sender: TObject);
begin
  Label1.Caption := InttoStr(k);
end;

{
ArrayBild[1].OnClick := ImageOnClick;
}

procedure TForm3.DefineKarte;
begin
  k := 0;
  while k<maxKarten do
  begin
    ArrayExist[k] := False;
    k := k + 1;
  end;
end;

procedure TForm3.NeueKarte;
begin
  k:=0;
  repeat
    k:=k+1;
  until ArrayExist[k]=False;

  ArrayExist[k] := True;

  ArrayBild[k] := timage.Create(Form3);
  ArrayBild[k].parent := Form3;
  ArrayBild[k].Stretch := True;
  ArrayBild[k].Transparent := True;
  ArrayBild[k].Picture.LoadFromFile(ExtractFilePath(ParamStr(0))+'Bilder\Jareth, der Löwentitan.jpg');

  ArrayBild[k].Left := xpos+k*10;
  ArrayBild[k].Top := ypos+k*10;
  ArrayBild[k].Width := breite;
  ArrayBild[k].Height := Round(breite*1.39);

  ArrayBild[k].Visible := True;
end;

procedure TForm3.MouseOverKarte;
begin
  k:=0;
  MousOverKarte:=False;

  while ((MousOverKarte=False) and (k<maxkarten)) do
  begin
    if (ArrayBild[k].Left<MouseStartPos.X) and (MouseStartPos.X<(ArrayBild[k].Left+breite)) then
    begin
      if (ArrayBild[k].Top<MouseStartPos.Y) and (MouseStartPos.Y<(ArrayBild[k].Top+Round(breite*1.39))) then
      begin
        xdifferenz:=MouseStartPos.X-ArrayBild[k].Left;
        ydifferenz:=MouseStartPos.Y-ArrayBild[k].Top;
        Down := True;
        MousOverKarte := True;
      end;
    end;

    if MousOverKarte=False then k := k + 1;
  end;
end;

procedure TForm3.FormActivate(Sender: TObject);
begin
  ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'einstellungen.ini');
  try
    JPEG:=TJpegImage.Create; // JPEG erzeugen
    BMP:=TBitmap.Create; // BMP erzeugen
    JPEG.LoadFromFile(ExtractFilePath(ParamStr(0))+'Bilder\'+ini.ReadString('Profil','Thema','Standard')+'\main.jpg');
    BMP.Assign(JPEG);
    Image1.Picture.Bitmap:=BMP;
    Image1.SendToBack;
  finally
    ini.free;
  end;

  SetLength(ArrayExist, maxKarten);
  SetLength(ArrayBild, maxKarten);
  SetLength(ArrayBildx, maxKarten);
  SetLength(ArrayBildy, maxKarten);

  DefineKarte;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  NeueKarte;
end;

procedure TForm3.ButtonBeendenClick(Sender: TObject);
begin
  Close;
end;

end.
nochmal zur erklärung:
momentan ist es nur so, dass wenn man auf den button klickt die images erzeugt werden und auf der fläche angezeigt werden. der zusatz bei top und left mit k*10 pixel sorgt dafür, dass optisch ein stapel auf der grafischen oberfläche entsteht.
geplant war nun, dass wenn ich auf eine karte k (das is meine variable für die karten wie ihr seht) klicke, die prozedur MousOverKarte guckt über welcher karte ich gerade mit der maus bin. k ist ja global und kann dann direkt weiterverwendet werden für das event onmousemove, wo die karte halt mit der maus mitgezogen wird.
ich muss dazusagen, dass das hin- und herziehen schon funktioniert hat, aber mit stretchdraw. da muss man aber mit fillrect oder so die schon gezeichneten karten wieder übermalen, was eine graue spur auf der grafischen oberfläche zur folge hat. möglich, dass euch da auch lösungen zu einfallen, aber ich bevorzuge die variante die ich momentan versuche umzusetzten. die events sind mir hierbei sehr wichtig, da ja viel zu programmieren ist in dem event onclik usw. nicht nur für das hin- und herziehen.

mfg Zenny

Klaus01 6. Jul 2009 22:02

Re: Array im Prozedurnamen ansprechen
 
.. Du hast zwar nicht danach gefragt, ich habe aber trotzdem
etwas korregiert.

Delphi-Quellcode:
procedure TForm3.FormActivate(Sender: TObject);
begin
  ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'einstellungen.ini');
  try
    JPEG:=TJpegImage.Create; // JPEG erzeugen
    //BMP:=TBitmap.Create; // BMP erzeugen
    JPEG.LoadFromFile(ExtractFilePath(ParamStr(0))+'Bilder\'+ini.ReadString('Profil','Thema','Standard')+'\main.jpg');
    //BMP.Assign(JPEG);
    Image1.Picture.Bitmap.assign(JPEG); // sollte auch so funktionieren.
    Image1.SendToBack;
  finally
    ini.free;
    JPEG.free; // freigeben nicht vergessen
  end;

  SetLength(ArrayExist, maxKarten);
  SetLength(ArrayBild, maxKarten);
  SetLength(ArrayBildx, maxKarten);
  SetLength(ArrayBildy, maxKarten);

  DefineKarte;
end;
.. aber warum im onActivate Event und nicht im OnCreate?

Aus der Hilfe:
Zitat:

property OnActivate: TNotifyEvent;

Description

Use OnActivate to perform special processing when the form receives focus. A form becomes active when focus is transferred to it (when the user clicks on the form, for example).

Note: The OnActivate event of the application (TApplication), not the form, occurs when Windows switches control from another application.

Grüße
Klaus

xZise 7. Jul 2009 00:15

Re: Array im Prozedurnamen ansprechen
 
Naja diese Zuweisung sollte man machen, sobald das Objekt da ist. Zum Beispiel in Zeile 84 (da ist so schön Platz :P ). Also auf jedenfall bevor das Ereignis gebraucht wird und nachdem das Bild existiert. Und du darfst natürlich NICHT direkt Imagearr[4].OnClick := ImageOnClick; sondern musst natürlich das entsprechende Image dann nehmen, zu dem du diese Eigenschaft zuweisen willst.

Wenn es dann nicht funktioniert, dann poste doch bitte die Fehlermeldung.

Achso ein Problem könnte auch sein, dass Activated (wie bereits beschrieben), nicht gerade passend ist :) Nimm doch OnCreate, weil Activated wird mehrmals aufgerufen.

Zudem musst du natürlich die erstellten Karten auch wieder freigeben!

MfG
xZise


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr.
Seite 1 von 2  1 2      

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