image(variable).visible

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
forenfun
Beiträge: 2
Registriert: Mi 25. Jun 2014, 22:14

image(variable).visible

Beitrag von forenfun »

Hallo,

ich möchte gern für mehrere Images in einer for-Schleife bestimmte Bedingungen bestimmen. Leider finde ich momentan keinen Weg wie ich das umsetzen kann. Im Internet bin ich auf die Variante mit Findcomponent gestoßen aber gleich mit dem Hinweis das man das eher nicht nutzen sollte.

for i:= 1 to 10 do (FindComponent('Image'+inttostr(i))as Timage).visible:=true; // funktioniert aber anscheinend nicht gern gesehen

Kann mir jemand einen Tip geben wie ich das sonst umsetzen könnte?

BG

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: image(variable).visible

Beitrag von Michl »

Je nachdem, was Du machen willst, könnte eine TImageList Dein Freund sein oder ein Array...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: image(variable).visible

Beitrag von theo »

Irgendwie ist auch wieder nicht ganz klar, was du eigentlich erreichen willst.
Ein TImage ist eine visuelle Komponente um ein Bild auf einem Formular in verschiedenen Varianten darzustellen.
Brauchst du wirklich mehrere von diesen oder geht es mehr um Bildrepresentatonen im Speicher, also z.B. ein TBitmap?

torte
Beiträge: 13
Registriert: Sa 9. Jun 2012, 08:45

Re: image(variable).visible

Beitrag von torte »

Ich denke er will mit einer Schleife auf mehrere Images zugreifen.

Dies könnt man lösen indem man die Images dynamisch als Array erzeugt:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var Bild: Array[0..6] of TImage;
    i: Integer;
begin
  For i:=0 to 6 do
   begin
     Bild[i]:=TImage.Create(nil);
     Bild[i].Parent:=Form1;
     Bild[i].Top:=50;
     Bild[i].Left:=i*50+i*10;
     Bild[i].Width:=50;
     Bild[i].Height:=50;
     With Bild[i].Canvas do
      begin
        Pen.Color:=clred;
        Brush.Color:=clred;
        Rectangle(0, 0, 50, 50);
      end;
   end;
end; 
Dann kannst du mit einer Schleife alle Images z.B. 10 px nach rechts verschieben, oder was du auch machen willst.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: image(variable).visible

Beitrag von Komoluna »

Der Code von torte wird nicht viel machen, da direkt auf das TImage gezeichnet wird(beim FormCreate).
Da nach dem FormCreate das Image neu gezeichnet wird, wird das gezeichnete wieder gelöscht(da kein puffer vorhanden).
Stattdessen sollte z.B. auf Bild.Picture.Bitmap.Canvas gezeichnet werden.

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

torte
Beiträge: 13
Registriert: Sa 9. Jun 2012, 08:45

Re: image(variable).visible

Beitrag von torte »

Ok. Ich habe das auch noch nie mit Images versucht. Lediglich mit Labels.
Ich dachte das lässt sich einfach so übertragen.

Wieder etwas dazu gelernt. :idea:

forenfun
Beiträge: 2
Registriert: Mi 25. Jun 2014, 22:14

Re: image(variable).visible

Beitrag von forenfun »

Danke für die bisherigen Kommentare.

Entschuldigt bitte wenn ich mich nicht klar genug ausgedrückt habe.

Also ich möcht so wie es auch schon torte vermutet hat mit einer Schleife auf mehrere Images zugreifen.

Code: Alles auswählen

 
  //nach links oder rechts  
  if image1.left+image1.Width >= panel2.Width then rechts:=false;
  if image1.left<1 then rechts:=true;
  //nach oben oder unten
  if image1.top +image1.height>= panel2.height then unten:=false;
  if image1.top<1 then unten:=true;
 
  if rechts = true then image1.left:=image1.left+xx
                   else image1.left:=image1.left-xx;
  if unten  = true then image1.top :=image1.top+yy
                   else image1.top :=image1.top-yy;  


Jetzt möchte ich halt nicht für jedes Image immer wieder das selbe einfügen, wenn sich ja nur die Nummer des Image ändert.

Ich bin mir nicht sicher ob das überhaupt der richtige Weg ist oder ich mich total verrannt habe.

BG
Zuletzt geändert von Lori am Sa 28. Jun 2014, 10:51, insgesamt 1-mal geändert.
Grund: Highlighter

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: image(variable).visible

Beitrag von Socke »

torte hat geschrieben:Ok. Ich habe das auch noch nie mit Images versucht. Lediglich mit Labels.
Ich dachte das lässt sich einfach so übertragen.
Das lässt sich übertragen und es funktioniert auch.
Komoluna hat geschrieben:Der Code von torte wird nicht viel machen, da direkt auf das TImage gezeichnet wird(beim FormCreate).
Da nach dem FormCreate das Image neu gezeichnet wird, wird das gezeichnete wieder gelöscht(da kein puffer vorhanden).
Stattdessen sollte z.B. auf Bild.Picture.Bitmap.Canvas gezeichnet werden.

TImage.Canvas geht immer auf den Zwischenspeicher TImage.Picture.Bitmap.Canvas. Dieser meldet Änderungen an das Image zurück, sodass es die Änderung auf den Bildschirm bringen kann. Man kann also zu (fast) jeder Zeit darauf zu greifen.

Den Code von torte habe ich leicht verbessert:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var Bild: Array[0..6] of TImage;
    i: Integer;
begin
  For i:=0 to 6 do
   begin
     Bild[i]:=TImage.Create(self);// Owner setzen, damit die Bilder auch wieder freigegeben werden
     Bild[i].Parent:=self; // mit Self kann man das Formular einfach umbenennen
     Bild[i].Top:=50;
     Bild[i].Left:=i*50+i*10;
     Bild[i].Width:=50;
     Bild[i].Height:=50;
     With Bild[i].Canvas do
      begin
        Pen.Color:=clred;
        Brush.Color:=clred;
        Rectangle(0, 0, 50, 50);
      end;
   end;
end;
Edit: Ergebnis-Screenshot hochgeladen.
Dateianhänge
So sieht das ganze dann aus
So sieht das ganze dann aus
image_variable.png (8.55 KiB) 1504 mal betrachtet
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: image(variable).visible

Beitrag von Komoluna »

oh, wusste nicht, dass sich da was geändert hat, früher waren TImage.Canvas und TImage.Picture.Bitmap.Canvas völlig unabhängig.
(Außer, dass TImage.Canvas immer den Inhalt von TImage.Picture.Bitmap.Canvas ausgibt...)

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Antworten