Wie komme ich an Dateiinhalte heran?

Für Fragen von Einsteigern und Programmieranfängern...
wp_xyz
Beiträge: 5156
Registriert: Fr 8. Apr 2011, 09:01

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von wp_xyz »

400kmh hat geschrieben: Ich schreibe grundsätzlich alles in eine Datei, damit ich mich nicht verzettel. Hatte damit nie ein Problem.
Na dann viel Spaß, wenn dein Programm mal größer wird.

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

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von Michl »

theo hat geschrieben:@michl: Auf einen flüchtigen Canvas sollte man nur in OnPaint zeichnen, nicht in OnClick. Auf Mac funktioniert das gar nicht afaik.
Ich weiss, wollte 400kmh nur nicht sofort überfordern. Allerdings ist die Aussage natürlich richtig und wichtig.

Besser wäre es z.B. in der Art:

Code: Alles auswählen

  TForm1 = class(TForm)
...
  private
    FPict: TPicture;
  end;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
  FPict.LoadFromFile('test.jpg');
  Repaint;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  FPict := TPicture.Create;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FPict);
end;
 
procedure TForm1.FormPaint(Sender: TObject);
begin
  if Assigned(FPict) then
    Canvas.Draw(0, 0, FPict.Bitmap);
end;
Wie auch immer, dann ist es aber eigentlich besser gleich ein TImage zu nehmen, was genau für die Anzeige eines TPictures gemacht wurde.

Code: Alles auswählen

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

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 »

400kmh hat geschrieben:
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.
Bitte nicht alles in eine Datei schreiben, das ist Grauenhafter Programmierstil. Außerdem sind GUI Anwendungen Event Basiert, was bedeutet dass man nur bei Message Events von Komponenten Code ausführen sollte. Die LCL kümmert sich dabei um den Idle Loop, also kurz gesagt, Finger weg von der LPR Datei, das widerspricht der kompletten Natur der LCL. Und ich kann dir versprechen, dass du damit nicht weit kommen wirst. Vielleicht hattest du noch nie ein Problem damit, aber zum einen ist das Ganze Eventbasiert anzugehen einfacher, Übersichtlicher, besser Wartbar, besser erweiterbar, und viel weniger Fehleranfällig. Es geht natürlich auch komplett imperativ alles über die LPR zu machen, aber das ist als etwa genauso sinnreich wie mit den Händen einen Nagel in die Wand zu schlagen, obwohl man einen Hammer hat.

Um mit Lazarus auf die Pixel von Bildern zuzugreifen verwende die Klasse TBtimap oder TLazIntfImage. TBitmap kannst du z.B. über Canvas oder ScanLine bearbeiten, TLazIntfImage via GetDataLineStart.

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:Das "OnPaint" Ereignis des Formulars wäre dafür geeignet und nicht ein Timer.
Klingt sinnvoller. Hab das mal so geändert. Aber zu welchen Zeitpunkten wird denn das OnPaint-Ereignis automatisch ausgelöst? Anscheinend zumindest einmal am Anfang.
wp_xyz hat geschrieben:Na dann viel Spaß, wenn dein Programm mal größer wird.
Mein längstes Programm ist 3674 Zeilen lang. Und ich kann davon ein Backup einfach in einer Textdatei speichern.

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 »

400kmh hat geschrieben:
theo hat geschrieben:Das "OnPaint" Ereignis des Formulars wäre dafür geeignet und nicht ein Timer.
Klingt sinnvoller. Hab das mal so geändert. Aber zu welchen Zeitpunkten wird denn das OnPaint-Ereignis automatisch ausgelöst? Anscheinend zumindest einmal am Anfang.
wp_xyz hat geschrieben:Na dann viel Spaß, wenn dein Programm mal größer wird.
Mein längstes Programm ist 3674 Zeilen lang. Und ich kann davon ein Backup einfach in einer Textdatei speichern.
Mehr Dateien = Übersichtlicher, und um die Backups kümmert sich Lazarus von selbst. Das wird dir jeder Programmierer mit ausreichend Erfahrung bestätigen. Das ist auch ein System welches sich so etabliert hat, in nahezu jeder Programmiersprache, denn es ist schlicht weg besser. Sieh dir mal Dijkstras Werke zum Strukturierten Programmieren an, es hat schon einen Grund warum das als Standard zum Sauberen Programmieren gilt. Selbst wenn du keine Probleme mit deinem Stil hast hast, es geht besser.

Außerdem erhöt sich mit mehr Dateien die Reuse-Value deines Codes drastisch. es gibt eigentlich keinen Grund nicht mehrere Dateien zu verwenden, grade weil IDE's nahezu alle Nachteile mehrerer Dateien ausgemerzt haben (Das Dateimanagement, Backups, selbst Git oder SVN management machen moderne IDE's ohne dass du dich damit befassen musst)

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

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von SoE »

Hi,
Ich schreibe grundsätzlich alles in eine Datei, damit ich mich nicht verzettel. Hatte damit nie ein Problem.
Wenn du nur die DPR bzw. LPR benutzen möchtest, dann kannst du ja auch alle anderen RAD Eigenschaften über Bord werfen und direkt die zugrundeliegende API ansprechen. Dann erhälst du winzige Programme, aber ab ca. 2 bis 3.000 Zeilen wird das dann echt unübersichtlich und du kannst nichts davon auf einfache Art in einem anderen Programm nutzen.

Besser wäre für kleine Programme den DesignTime-RAD-Modus von Lazarus zu nutzen und themenspezifisch deinen QuellCode in eigene Units auszulagern, die du dann in allen Programmen sehr leicht wiederverwenden kannst. Das ist dann auch sehr sehr sehr viel übersichtlicher und wird immer übersichtlicher je größer das Programm wird.
Das heißt ich kann mit Standard-Lazarus nicht abfragen welche Farbe irgendein Pixel in einer Bilddatei hat? Das wäre schlecht.
Sicher kann man so etwas Einfaches mit Lazarus machen, ich dachte du brauchst vielleicht semitransparente Pixel und alles was man in dem Zusammenhang noch so gebrauchen könnte... dafür sind die LIB's ja da...
Wie auch immer, dann ist es aber eigentlich besser gleich ein TImage zu nehmen, was genau für die Anzeige eines TPictures gemacht wurde.
Genau, TImage ist RAD pur: Einfach ein Bild laden und sich dann um nichts mehr kümmern zu müssen... inklusive aller Events, die man gleich mitbekommt...

Du kannst ja gerne Umwege gehen, aber besser wäre es natürlich den direkten Weg sofort zu benutzen...

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

Re: Wie komme ich an Dateiinhalte heran?

Beitrag von SoE »

Klingt sinnvoller. Hab das mal so geändert. Aber zu welchen Zeitpunkten wird denn das OnPaint-Ereignis automatisch ausgelöst? Anscheinend zumindest einmal am Anfang.
Programmstart: OnCreate, OnShow, OnPaint, OnActivate, OnPaint, OnResize (optional).... So war das glaube ich ...

EDIT: Ich sitze hier gerade vor Delphi 7 und da bekomme ich immer zweimal OnPaint beim Start...
Bei Lazarus gibt es scheinbar nur einmal OnPaint:
Also OnCreate, OnShow, OnActivate, OnPaint und optional OnResize...


+ jedesmal wenn du selbst per QuellCode ein Repaint einleitest
+ immer wenn das Fenster minimiert war und wieder angezeigt wird

Antworten