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 2 von 2     12   
Zenny90

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

Re: Array im Prozedurnamen ansprechen

  Alt 7. Jul 2009, 11:31
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 ??
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#12

Re: Array im Prozedurnamen ansprechen

  Alt 7. Jul 2009, 13:07
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:
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.
  Mit Zitat antworten Zitat
Zenny90

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

Re: Array im Prozedurnamen ansprechen

  Alt 7. Jul 2009, 19:42
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?
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

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

Re: Array im Prozedurnamen ansprechen

  Alt 7. Jul 2009, 20:37
Ich glaube, dir hilft da ein Delphi-Referenz durchsuchenBringToFront weiter.

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:05 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