Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Während ein Programm läuft, Image hinzufügen (https://www.delphipraxis.net/147672-waehrend-ein-programm-laeuft-image-hinzufuegen.html)

zapper54 13. Feb 2010 19:34


Während ein Programm läuft, Image hinzufügen
 
Hallo!

Ich habe ein Problem: Während mein Programm läuft, soll in einer Textdatei gelesen werden. Dort soll dann z.B. das wort image stehen. Immer wenn mein Programm das liest, soll es ein neues Image erstellen, und zwar an den Koordinaten, die dann da hinter stehen sollen und mit dem Bild (Pfad soll dann dort stehen) und natürlich auch in der richtigen Größe.

Könnt ihr mir da helfen?

MfG

zapper54

jaenicke 14. Feb 2010 15:05

Re: Während ein Programm läuft, Image hinzufügen
 
Wo ist denn das Problem dabei?
  • Auslesen der Textdatei selbst?
  • Dynamisches Erstellen eines TImage?
  • Positionieren des TImages?
  • Laden des Bildes?
Hast du schon etwas versucht? Funktioniert etwas nicht?

Lumpiluk 14. Feb 2010 15:39

Re: Während ein Programm läuft, Image hinzufügen
 
Statt einer einfachen Textdatei würde ich dir für so etwas eine INI empfehlen. Ansonsten würde ich die Koordinaten in der normalen Textdatei auch nicht hinter das Wort 'Image' schreiben, sondern jeweils in eine Zeile.

Delphi-Narr 15. Feb 2010 10:46

Re: Während ein Programm läuft, Image hinzufügen
 
Ich gehe jetzt mal davon aus, dass du die Werte so in einer Textdatei stehen hast:

Name des Objekts
Left-Koordinate
Top-Koordinate
Width
Heigth

Beispiel:

Image1
100
100
200
150


Delphi-Quellcode:
Uses ...,extctrls;

//In der Variablendeklaration:
var
   //Ich verwende jetzt mal eine Stringlist, um die Datei zu laden
   SL:TStringlist;
   //Um ein dynamisches Objekt zur Laufzeit zu erstellen, ein TImage in einer Variable deklarieren
   Objekt:TImage;

   //Jetzt muss die Datei geladen werden. Ich mache es beim Klick auf einen Button

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
     SL:=TStringlist.create;
     SL.LoadFromFile('Test.txt');
     i:=0; //Erste Zeile der Stringlist wird durch SL[0] angesprochen (Immer -1)

     //Objekte erstellen durch eine Schleife
     while i<SL.count do
     begin
          Objekt:=TImage.create(Form1);
          Objekt.name:=SL[i]; //Name des Objekts wird aus der Liste ausgelesen
          Objekt.Left:=StrToInt(SL[i+1]); //Leftwert befindet sich eine Zeile hinter dem Namen
          Objekt.Top:=StrToInt(SL[i+2]); //Topwert befindet sich zwei Zeilen hinter dem Namen
          Objekt.Width:=StrToInt(SL[i+3]);
          Objekt.Height:=StrToInt(SL[i+4]);
          Objekt.parent:=Form1;
          Objekt.show;
          Objekt.Canvas.FloodFill(1,1,clblack,fsSurface); //Das musst du halt ersetzen, ein Bild reinladen oder sonst was
          i:=i+5; //Springt zum nächsten Namen in der Liste
     end;
end;
Ich hoffe so sollte es sein...

Liebe Grüße!

zapper54 15. Feb 2010 18:47

Re: Während ein Programm läuft, Image hinzufügen
 
@Delphi-Narr:

Sieht ganz gut aus, ich habe aber noch eine Frage:
Ich würde die Textdatei mit
Delphi-Quellcode:
var
f:textfile;
s:string;

assaignfile(f,'C:\geheim.txt');
reset(f); //Damit ich auch die 1. Zeile lese
readln(f,s);
closefile(f);
Soweit erstmal. Sagt mir bitte, wenn das aus irgendeinem Grund nicht geht.

Jetzt verstehe ich das aber nicht, wie du das mit der Liste machst. Ich habe noch nie mit Listen gearbeitet...
Geht es vielleicht auch einfacher, und nicht so umständlich wie
Zitat:

Delphi-Quellcode:
while i<SL.count do
     begin
          Objekt:=TImage.create(Form1);
          Objekt.name:=SL[i];
          Objekt.Left:=StrToInt(SL[i+1]);
          Objekt.Top:=StrToInt(SL[i+2]);
          Objekt.Width:=StrToInt(SL[i+3]);
          Objekt.Height:=StrToInt(SL[i+4]);
          Objekt.parent:=Form1;
          Objekt.show;
          Objekt.Canvas.FloodFill(1,1,clblack,fsSurface);
          i:=i+5;
     end;

Kann man der Form einen Befehl geben, mit der sie selber ein neues Image erstellt?

Danke schonmal für eure Antworten.

mkinzler 15. Feb 2010 18:54

Re: Während ein Programm läuft, Image hinzufügen
 
Zitat:

Kann man der Form einen Befehl geben, mit der sie selber ein neues Image erstellt?
Man könnte diese um eine entsprechende Methode erweitern.

Achtung: Zeichenbefehle nur in Paint()-Methode ausführen, denn sonst wird beim Neuzeichnen ( beim Verschieben, nach Übdedeckung usw.) deine Zeichnung gelöscht.

zapper54 15. Feb 2010 18:55

Re: Während ein Programm läuft, Image hinzufügen
 
Ok, aber mit diesen Methoden selbsterstellen... Wie macht man das?

mkinzler 15. Feb 2010 18:56

Re: Während ein Programm läuft, Image hinzufügen
 
Wann soll ein neues erzeugt werden?

zapper54 15. Feb 2010 19:10

Re: Während ein Programm läuft, Image hinzufügen
 
Wenn eine Bedingung erfüllt ist, wie z.B. Wenn mein Mauszeiger inerhalb eines Quadrates ist.

Delphi-Narr 15. Feb 2010 19:49

Re: Während ein Programm läuft, Image hinzufügen
 
Du kannst das natürlich auch mit Textfile machen...
Du lädst die Textdatei in die Liste und kannst dann über Sl[Zahl] auf eine bestimmte Zeile der Datei zugreifen.
Du kannst natürlich ein Image erstellen, ohne das Ganze immer einzelnd zu machen.
Hier eine allgemeine Prozedur ohne eine neue Methode zu erstellen:

Delphi-Quellcode:
procedure TForm1.ErstelleImage(Fuer:TForm;aLeft,aTop,aWidth,aHeight:integer; Quelle:string; Strecken:Boolean);
var I:TImage;
begin
     I:=TImage.create(Fuer);
     I.left:=aLeft;
     I.Top:=aTop;
     I.width:=aWidth;
     I.height:=aHeight;
     if FileExists(Quelle) then I.Picture.Bitmap.LoadFromFile(Quelle);
     I.parent:=Fuer;
     I.Stretch:=Strecken;    
end;
So würde dann der Aufruf aussehen:

Delphi-Quellcode:
     ErstelleImage(Form1,100,100,100,100,'a.bmp',True);
Hierbei würde ein Image auf Form1 mit Left, Top, Width und Height = 100 erstellt. Es würde ein Bild aus der Datei "a.bmp" geladen und dieses würde auf die Größe des Images gestreckt werden...

Liebe Grüße!

xZise 15. Feb 2010 23:03

Re: Während ein Programm läuft, Image hinzufügen
 
Moin,
erstmal ein kleiner Hinweis: Dieses "a.bmp" ist eigentlich unzureichend. Du weißt nie so richtig, welchen Pfad du davor hast (das muss nicht umbedingt der Pfad zur *.exe sein!).
Stattdessen am besten den Pfad deiner *.exe vorne dranfügen:
Delphi-Quellcode:
ExtractFilePath(ParamStr(0)) + 'a.bmp'
Das ParamStr(0) gibt den Dateiname deiner exe-Datei zurück. Und das ExtractFilePath dann den Pfad zu einer Datei inklusive eines abschließenden "\".

Zur "Liste":
An sich ist die Einfach zu benutzen:
Delphi-Quellcode:
var
  SL : TStringList;
  i : Integer;
begin
  SL := TStringList.Create;
  SL.LoadFromFile(....);
  for i := 0 to SL.Count - 1 do
  begin
    ShowMessage(SL[i]);
  end;
end;
Hier erstelle ich zuerst ein Objekt mit dem ich dann arbeiten kann. Dann lade ich die Datei (TStringList.LoadFromFile(<Dateiname>)) und gehe dann jede Zeile durch und lasse die als Dialog ausgeben. Dabei gibt TStringList.Count die Anzahl der Zeilen an. Und mit den eckigen Klammern kannst du auf eine Zeile zugreifen (beginnend bei 0).

MfG
Fabian

Delphi-Narr 16. Feb 2010 10:29

Re: Während ein Programm läuft, Image hinzufügen
 
Das "a.bmp" nicht ausreichend ist, ist mir schon klar... Standardmäßig wird jedoch das Programmverzeichnis benutzt.
Es bringt aber eigentlich nichts, wenn man die Zeilen ausgeben lässt.

Also wenn man jetzt alle Objekte erstellen will und meine Prozedur benutzen würde, könnte man das so aufrufen:

In der Datei sieht das so aus:


Name
Left
Top
Width
Height
Quelle

Aufruf:
Delphi-Quellcode:
var
  SL : TStringList;
  i : Integer;
begin
  SL := TStringList.Create;
  SL.LoadFromFile(Dateipfad der *.txt); //Datei mit Angaben zu den Images in die Liste laden
  i:=0;
  while i<SL.count do //Liste durchlaufen
  begin
       ErstelleImage(Form1,StrToInt(SL[i+1]),StrToInt(SL[i+2]),StrToInt(SL[i+3]),StrToInt(SL[i+4]),SL[i+5],True);
       i:=i+6;
  end;
  SL.Free;
end;
Edit:
Also hier wird die Liste SL, in der sich alle Zeilen der Datei befinden, durchlaufen. Bei dieser Methode empfiehlt sich keine
for-Schleife, da pro Schleifendurchlauf auf 5 verschiedene Zeilen zugegriffen wird.
Anschließend wird die Prozedur ErstelleImage aufgerufen. Als parameter werden Zeilen aus der Liste übergeben. Die Zeilenzahl ist immer relativ zur Zeile, in der sich der Name befindet (Image1,etc)
Um zum nächsten Objekt zu springen, wird i um 6 erhöht. Dadurch werden die bereits in SL[i+x] verwendeten Werte übersprungen

Liebe Grüße

xZise 16. Feb 2010 10:36

Re: Während ein Programm läuft, Image hinzufügen
 
Zitat:

Zitat von Delphi-Narr
Das "a.bmp" nicht ausreichend ist, ist mir schon klar...

Dir vielleicht aber nicht den Threadersteller.
Zitat:

Zitat von Delphi-Narr
Standardmäßig wird jedoch das Programmverzeichnis benutzt.

Aber (wenn ich mich richtig erinnere) sobald ein Speichern/Öffnen Dialog aufgerufen wurde, ist das anders!
Zitat:

Zitat von Delphi-Narr
Es bringt aber eigentlich nichts, wenn man die Zeilen ausgeben lässt.

Es war nur als Beispiel gedacht, was er mit einer TStringList machen kann. Du hast mehr oder weniger einfach Code gepostet ohne das der Threadersteller weiß was er da tut.

MfG
Fabian

Delphi-Narr 16. Feb 2010 10:53

Re: Während ein Programm läuft, Image hinzufügen
 
Zitat:

Zitat von xZise
Zitat:

Zitat von Delphi-Narr
Das "a.bmp" nicht ausreichend ist, ist mir schon klar...

Dir vielleicht aber nicht den Threadersteller.

Es war nur als Beispiel gedacht, dass klar wird, dass man an dieser Stelle den Pfad der Datei weitergeben muss.
Zitat:

Zitat von xZise
Zitat:

Zitat von Delphi-Narr
Standardmäßig wird jedoch das Programmverzeichnis benutzt.

Aber (wenn ich mich richtig erinnere) sobald ein Speichern/Öffnen Dialog aufgerufen wurde, ist das anders!

Das war mir nicht so klar... Wieder was gelernt^^

Zitat:

Zitat von xZise
Zitat:

Zitat von Delphi-Narr
Es bringt aber eigentlich nichts, wenn man die Zeilen ausgeben lässt.

Es war nur als Beispiel gedacht, was er mit einer TStringList machen kann. Du hast mehr oder weniger einfach Code gepostet ohne das der Threadersteller weiß was er da tut.

Ich hatte den ersten Code mit sehr vielen Kommentaren versehen, alle weiteren Codeschnipsel müssten eigentlich klar sein, wenn man den ersten verstanden hat.
Ich editier den lezten dann mal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz