Delphi-PRAXiS
Seite 2 von 2     12   

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 7. Jul 2009 11:31

Re: Array im Prozedurnamen ansprechen
 
dankeschön, das event wird nun ausgelöst. hier nochma der code:

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 DefineKarte;
    procedure NeueKarte;
    procedure Test(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(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.Test(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  k:=0;
  MousOverKarte:=False;

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

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

  Label1.Caption := InttoStr(k)+' '+InttoStr(ArrayBild[k].Left);
end;

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].OnMouseDown := Test;
end;    

procedure TForm3.FormCreate(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;          
    JPEG.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.
hab das auch nun umgetauscht, wo das bild geladen wird. nich mehr bei active sondern bei create.
dort wo das event ausgelöst wird, was bei mir "Test" ist, seht ihr kommentierten code. das liegt daran, dass er da rummeckert. es liegt wohl daran wie ich ArrayBild[k] anspreche, wo ich mich aber frage ?warum?, weil das bei stretchdraw genauso auch war und funktioniert hat.

ziel des ganzen ist es, dass ich mit onmousedown, die karte ermittel wo die maus drüber is. dann wird mit onmousemove die karte mitgezogen (normalerweise wird dann halt immer ArrayBild[k].Left und .Top mit anepasst) und mit onmouseup wird der boolean-wert Down wieder auf false gesetzt, damit er aufhört die karte mitzuziehen.

aber ich kann ArrayBild[k] nich mehr ansprechen ??

Blup 7. Jul 2009 13:07

Re: Array im Prozedurnamen ansprechen
 
Du prüfst vor der Zuweisung auf Label1.Caption nicht, ob du überhaupt eine Karte gefunden hast. Wenn das nähmlich innerhalb deiner Schleife nicht der Fall ist, hat k den Wert maxKarten und zeigt damit über das Array hinaus. Das gibt im besten Fall eine Indexverletzung, im schlimmsten Fall eine Zugriffsverletzung.
Also weise Label1.Caption abhängig von MousOverKarte entweder den Wert wie bisher zu oder eine leere Zeichenkette.

Abgesehen davon ist der Vergleich von X und Y falsch und überflüssig.
Die Methode ist dem Ereignis OnMouseDown der Karte zugewiesen.
Demzufolge ist Sender das Image, auf das geklickt wurde.
X und Y sind Koordinaten innerhalb der Karte mit dem Ursprung der linken oberen Ecke der Karte.
Left und Top der Karte haben aber als Ursprung die linke obere Ecke des Formulars(Clientbereich).
Beide Werte können deshalb nicht direkt miteinander verglichen werden.
Der Vergleich müsste etwa so lauten:
Delphi-Quellcode:
if ArrayBild[k] = Sender then
In der Methode NeueKarte wird noch nicht der Fall berücksichtigt, daß bereits 120 Karten erzeugt wurden.
In diesem Fall gäbe es dort auch einen Fehler wie oben.

Zenny90 7. Jul 2009 19:42

Re: Array im Prozedurnamen ansprechen
 
danke leute thx :)

das einzige was nun noch genial wäre festzulegen wie weit "oben" ein bild angezeigt wird. in html-programmierung nennt sich das z-index.

wenn ich sagen wir 3 bilder hintereinander erstellen lasse durch den button, bildet sich ja ein stapel. schieb ich nun die karte 2 aus der mitte des stapels weiter dem unteren bildrand entgegen, aber so dass sie sich immernoch mit karte 3 überlappt, dann ist es so, dass die karte 2 immernoch unter der karte 3 angezeigt wird.
die letzte karte die man also erstellt hat wird immer ÜBER allen anderen karten angezeigt. nun würd ich gern irgendwie einstellen, dass eine zuvor erstellte karte 2 ganz oben angezeigt wird, wenn man sie beispielsweise anklickt, oder bewegt.

wisst ihr da auch zufällig was?

xZise 7. Jul 2009 20:37

Re: Array im Prozedurnamen ansprechen
 
Ich glaube, dir hilft da ein Delphi-Referenz durchsuchenBringToFront weiter.

MfG
xZise


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

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