Wie komme ich an Dateiinhalte heran?

Für Fragen von Einsteigern und Programmieranfängern...
400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Wie komme ich an Dateiinhalte heran?

Beitrag von 400kmh »

Hallo, ich würde gerne in einem Lazarus-Programm mit Daten, die in Dateien gespeichert sind, rechnen.

Aber wie bekomme ich Daten aus einer Datei?

Nehmen wir als Beispiel eine Datei mit folgendem Pfad, Namen und Typ: "C:\test.bmp"

Was muss ich nun in ein Programm schreiben um da dran zu kommen?

Was muss ich unter "uses" hinschreiben?

Welche Variablen brauche ich?

Was muss ich ins Hauptprogramm schreiben?

Mathias
Beiträge: 6919
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von Mathias »

Nehmen wir als Beispiel eine Datei mit folgendem Pfad, Namen und Typ: "C:\test.bmp"
Willst du ein Bild berechnen.
Hallo, ich würde gerne in einem Lazarus-Programm mit Daten, die in Dateien gespeichert sind, rechnen.
Man müsste genauer wissen, um welche Dateien es sich handelt.
Ist es eine Text-Datei, dann ist es einfach, eine StingList erzeugen und mit LoadFromFile laden.

Ist es eine Binär-Datei, dann wird es schwieriger, man muss die Datenstruktur kennen.
Und somit wird dann am besten mit FileStreams gearbeitet.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von 400kmh »

Mathias hat geschrieben:
Nehmen wir als Beispiel eine Datei mit folgendem Pfad, Namen und Typ: "C:\test.bmp"
Willst du ein Bild berechnen.
Ich will zunächst Bilder verändern/vereinfachen und dann noch mehr damit machen. Grob gesagt.
Mathias hat geschrieben:
Hallo, ich würde gerne in einem Lazarus-Programm mit Daten, die in Dateien gespeichert sind, rechnen.
Man müsste genauer wissen, um welche Dateien es sich handelt.
Es handelt sich vor allem um bmp-Dateien aber auch um jpg- und png-Dateien.

Warf
Beiträge: 2122
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von Warf »

Für Bilder kannst du die Graphics Unit aus der LCL verwenden, die kümmert sich auch um das Lesen und Schreiben der Dateien

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von 400kmh »

Warf hat geschrieben:Für Bilder kannst du die Graphics Unit aus der LCL verwenden, die kümmert sich auch um das Lesen und Schreiben der Dateien
Aha, ich habs mal mit folgendem Code probiert:

Code: Alles auswählen

Program Bildprogramm; {$mode objfpc} {$H+}
 
{$apptype gui}
 
uses
  Interfaces, Forms, Graphics, ExtCtrls;
 
Var
  Form1: TForm;
  Image1: TImage;
 
begin
  Application.Initialize;
  Application.CreateForm(TForm, Form1);
  Image1.Picture.LoadFromFile('C:\test.bmp');
  Application.Run;
  end.
Ich bekomme da die Fehlermeldung: "External SIGSEGV" in der Zeile "Image1.Picture.LoadFromFile('C:\test.bmp');"

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

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von theo »

Willst du uns veralbern?
Du bist seit sechs Jahren im Forum angemeldet und hast 0,0 Ahnung von gar nichts?
Das kann nicht sein.
:lol:

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von 400kmh »

theo hat geschrieben:Willst du uns veralbern?
Du bist seit sechs Jahren im Forum angemeldet und hast 0,0 Ahnung von gar nichts?
Das kann nicht sein.
:lol:
Ich habe Pascal in der 10. Klasse gelernt, und dann eigenständig nadelstichartig bestimmte Dinge vertieft aber vieles links liegen gelassen was ich nicht gebraucht habe. Ich habe ein paar Programme mit über 1000 Zeilen geschrieben. In den letzten Jahren habe ich jedoch mehr mit Python programmiert. Für das, was ich jetzt vorhabe, halte ich Pascal jedoch für besser.

SoE
Beiträge: 84
Registriert: Mo 31. Aug 2015, 01:51

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von SoE »

Vielleicht ein kleiner Vorschlag:
http://downloads.delphi-treff.de/DelphiStarter.pdf

Zisch dir doch mal dieses PDF... Ja ich weiß, dass ist eigentlich für "Embar-DELPHI-XE-irgendwas" geschrieben worden, aber alles was ich im Anfang davon gesehen habe kann man 1:1 auf Lazarus übertragen.
Darin kannst du ganz schnell die Basics finden und auch wo und wie du was machen kannst. Also auch was mache ich mit *.DPR (*.LPR), PAS, *.DFM (*.LFM) ... Dateien und wo kann ich was reinschreiben...
Den Anfang über die Installation läßt du einfach weg...

Das PDF ist sehr schön gemacht !!!

Sicher gibt es auch etwas vergleichbares direkt für Lazarus, aber nötig ist das eigentlich danach nicht mehr...
Image1.Picture.LoadFromFile('C:\test.bmp');
Das hier hat in der DPR bzw. LPR eigentlich nichts zu suchen...
Starte doch einfach mal Lazarus und ziehe dir erstmal alles an Buttons und Knöpfen und was immer du brauchst auf das Formular (Form1) und dann schau dir die Events an, die du gebrauchen kannst und sage dem Programm was es machen soll.

Vielleicht noch eine Sache: Wenn du wirklich Bilddateien bearbeiten oder verändern möchtest, dann wirst du dir wohl auch noch ein Framework oder eine externe Library anschauen müssen, die kannst du dann DesignTime oder Runtime einbinden... oder beides... (Package usw.) (AggPas, GR32, VampyreImaging LIB usw....)

Viel Erfolg !!!

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von 400kmh »

SoE hat geschrieben:Vielleicht ein kleiner Vorschlag:
http://downloads.delphi-treff.de/DelphiStarter.pdf
Bis einschließlich Punkt 4.6 kann ich das alles. In Punkt 4.11 gehts um Dateien. Bilddateien werden da aber nicht behandelt.
SoE hat geschrieben:
Image1.Picture.LoadFromFile('C:\test.bmp');
Das hier hat in der DPR bzw. LPR eigentlich nichts zu suchen...
Ich schreibe grundsätzlich alles in eine Datei, damit ich mich nicht verzettel. Hatte damit nie ein Problem.
SoE hat geschrieben: Starte doch einfach mal Lazarus und ziehe dir erstmal alles an Buttons und Knöpfen und was immer du brauchst auf das Formular (Form1) und dann schau dir die Events an, die du gebrauchen kannst und sage dem Programm was es machen soll.
Ich mache das alles schriftlich, da habe ich alles in einer Textdatei und kann es jederzeit sofort rekonstruieren.

Auf das Formular müssen nur ein oder zwei Bilder drauf und vielleicht noch eine Textausgabe. Das habe ich schon öfters gemacht und ist nicht schwer. Das Programm soll nur berechnen und ausgeben. Aber dazu müsste ich erstmal an Bilddateien rankommen.
SoE hat geschrieben: Vielleicht noch eine Sache: Wenn du wirklich Bilddateien bearbeiten oder verändern möchtest, dann wirst du dir wohl auch noch ein Framework oder eine externe Library anschauen müssen, die kannst du dann DesignTime oder Runtime einbinden... oder beides... (Package usw.) (AggPas, GR32, VampyreImaging LIB usw....)
Das heißt ich kann mit Standard-Lazarus nicht abfragen welche Farbe irgendein Pixel in einer Bilddatei hat? Das wäre schlecht.
SoE hat geschrieben:Viel Erfolg !!!
Danke.

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von 400kmh »

Neuer Versuch:

Code: Alles auswählen

Program Bildprogramm; {$mode objfpc} {$H+}
 
{$apptype gui}
 
uses
  Interfaces, Forms, Graphics, ExtCtrls, GraphType, IntfGraphics, LCLType, LCLProc,  LCLIntf;
 
Var
  Form1: TForm;
  Bitmap1: TBitmap;
 
begin
  Application.Initialize;
  Application.CreateForm(TForm, Form1);
 
  Bitmap1:=TBitmap.Create;
  Bitmap1.LoadFromFile('c:\test.bmp');
 
  Form1.Canvas.Draw(0,0,Bitmap1);
 
  Application.Run; end.
Eine Fehlermeldung gibts jetzt nicht mehr. Aber es wird kein Bild angezeigt. Auch wenn ich was anderes versuche mit Canvas zu zeichnen funktionierts nicht, obwohl das in einem älteren Programm von mir geklappt hat. Irgendetwas vergesse ich, was ich aber in meinem älteren Programm nicht wiederfinde.

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von Jole »

Schau Dir mal diese Kurse an: http://www.paukert.at/#delphi Ist für Einsteiger und Fortgeschrittene, u.a. auch Grafik (Bilder laden, Verarbeiten und Speichern). Ist zwar für Delphi7, kann aber problemlos mit Lazarus verwendet werden.

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

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von Michl »

Meine Empfehlung:

- zuerst: http://wiki.freepascal.org/Form_Tutorial/de
- dann zu dem: http://wiki.freepascal.org/TButton/de
- wenn du erfolgreich ein TButton auf dem Formular eingefügt hast, kannst du sowas in seinem OnClick-Eventhandler machen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  Pict: TPicture;
begin
  Pict := TPicture.Create;
  Pict.LoadFromFile('test.jpg');
  Canvas.Draw(0, 0, Pict.Bitmap);
  Pict.Free;
end;
Als nächstes kannst du dich dem widmen, wie man Pixel in einem Bitmap ändert: http://wiki.freepascal.org/Developing_with_Graphics/de

Code: Alles auswählen

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

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

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von theo »

400kmh hat geschrieben:
SoE hat geschrieben: Das hier hat in der DPR bzw. LPR eigentlich nichts zu suchen...
Ich schreibe grundsätzlich alles in eine Datei, damit ich mich nicht verzettel. Hatte damit nie ein Problem.
Das ist eine ganz schlechte Idee, damit gibt du die meisten Vorteile von Lazarus auf.
Lass die *.lpr doch einfach in Ruhe und arbeite in Unit1, dann "verzettelst" du dich bestimmt nicht.

@michl: Auf einen flüchtigen Canvas sollte man nur in OnPaint zeichnen, nicht in OnClick. Auf Mac funktioniert das gar nicht afaik.

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von 400kmh »

So, ich habe jetzt eine pothässliche Lösung gefunden, die aber funktioniert:

Code: Alles auswählen

Program Bildprogramm; {$mode objfpc} {$H+}
 
{$apptype gui}
 
uses
  Interfaces, Forms, Graphics, ExtCtrls, GraphType, IntfGraphics, LCLType, LCLProc,  LCLIntf;
 
Type
  TForm1 = class(TForm)
    Procedure Timer1Timer(Sender: TObject); end;
 
Var
  Form1: TForm1;
  Timer1: TTimer;
  Bitmap1: TBitmap;
 
Procedure TForm1.Timer1Timer(Sender: TObject); begin
  Form1.Canvas.Draw(0,0,Bitmap1);
  Timer1.Enabled:=false; end;
 
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1); 
  with Form1 do begin
    Left:=0;
    Width:=round(Screen.WorkAreaWidth-8);
    Top:=0;
    Height:=round(Screen.WorkAreaHeight-27);
    Show; end;
 
  Timer1:=TTimer.Create(Form1); 
  with Timer1 do begin
    OnTimer:=@Form1.Timer1Timer;
    Interval:=1; end;
 
  Bitmap1:=TBitmap.Create;
  Bitmap1.LoadFromFile('c:\test.bmp');
 
  Application.Run; end.
Das Bild wird nun angezeigt. Canvas scheint erst zu funktionieren, wenn das Programm bereits läuft. Also habe ich das mit einem ansonsten total überflüssigen Timer gelöst. Das ist zwar pothässlich, aber im Moment ist mir alles recht, solange es funktioniert.

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

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von theo »

400kmh hat geschrieben: Das Bild wird nun angezeigt. Canvas scheint erst zu funktionieren, wenn das Programm bereits läuft. Also habe ich das mit einem ansonsten total überflüssigen Timer gelöst. Das ist zwar pothässlich, aber im Moment ist mir alles recht, solange es funktioniert.
Das "OnPaint" Ereignis des Formulars wäre dafür geeignet und nicht ein Timer.
Aber hör bitte mit dem *.lpr Quatsch auf, davon bekommt man ja Augenkrebs. :wink:

Antworten