AGB  ·  Datenschutz  ·  Impressum  







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

Array im Prozedurnamen ansprechen

Ein Thema von Zenny90 · begonnen am 6. Jul 2009 · letzter Beitrag vom 7. Jul 2009
Antwort Antwort
Seite 1 von 2  1 2      
Zenny90

Registriert seit: 6. Jul 2009
4 Beiträge
 
Delphi 7 Enterprise
 
#1

Array im Prozedurnamen ansprechen

  Alt 6. Jul 2009, 19:44
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Array im Prozedurnamen ansprechen

  Alt 6. Jul 2009, 19:56
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Array im Prozedurnamen ansprechen

  Alt 6. Jul 2009, 20:19
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: Array im Prozedurnamen ansprechen

  Alt 6. Jul 2009, 20:42
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;
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Array im Prozedurnamen ansprechen

  Alt 6. Jul 2009, 20:50
Eindeutig zu viel mit .NET gearbeitet, Julius. In Delphi heißt das noch TObject.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Array im Prozedurnamen ansprechen

  Alt 6. Jul 2009, 21:06
Zitat von jfheins:
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

Re: Array im Prozedurnamen ansprechen

  Alt 6. Jul 2009, 21:38
Zitat von Apollonius:
Eindeutig zu viel mit .NET gearbeitet, Julius. In Delphi heißt das noch TObject.
Ihhhh ... was für eine rückständige Sprache
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

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.
  Mit Zitat antworten Zitat
Zenny90

Registriert seit: 6. Jul 2009
4 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Array im Prozedurnamen ansprechen

  Alt 6. Jul 2009, 21:51
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
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Array im Prozedurnamen ansprechen

  Alt 6. Jul 2009, 22:02
.. 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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Array im Prozedurnamen ansprechen

  Alt 7. Jul 2009, 00:15
Naja diese Zuweisung sollte man machen, sobald das Objekt da ist. Zum Beispiel in Zeile 84 (da ist so schön Platz ). 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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:31 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