![]() |
Re: Ausgabe eines geladenen Records in Memofeldern
Moin, Moin Giertier.
Das sind ja nun mehrere Dinge, die angepackt werden müssten. Da du offenbar noch nicht so richtig fit mit Delphi bist, stellt sich nun die Frage wo der dringenste Optimierungsbedarf liegt: In der Programmstruktur oder der Aufgabenstellung, auch mehrere Datensätz zu speichern. Ich schlage vor, zunächst die Programmstruktur zu verbessern, sonst wird alles mit jeder zusätzlichen Codezeile noch unübersichtlicher und verworrener. Das Handling mehrerer Datensätze im RecordArray ist dann eher eine Marginalie. Damit wir dir besser helfen können, ist es wohl das Beste, wenn du den kompletten Source zur Verfügung stellst um im Detail nachzuvollziehen, welche Aufgaben die vorhandenen Module/Formulare haben. |
Re: Ausgabe eines geladenen Records in Memofeldern
Heyho ^^
find ich super, dass einem hier so geholfen wird :) Also, ich will ja nicht, dass ihr die ganze Aufgabe für mich löst ;), ich wills ja auch verstehn, aber wäre wirklich super, wenn ihr mir an diversen Stellen weiterhelfen könntet, für die ich einfach zu sehr Noob auf diesem Gebiet bin. Also hier mal der Code Unit eins, das Startformular. ![]()
Delphi-Quellcode:
Unit 2, Bildschirm für spätere erweiterte Suche (Hab ich mich bis jetzt noch gar nich drum gekümmert)
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, jpeg, unit2,unit3, Pfadkopie, ExtDlgs, GraphicEx,GifImage; type TForm1 = class(TForm) Panel1: TPanel; GroupBox2: TGroupBox; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; GroupBox3: TGroupBox; Button8: TButton; Button9: TButton; Edit1: TEdit; ListBox1: TListBox; Label13: TLabel; Button10: TButton; Image1: TImage; Panel2: TPanel; Image2: TImage; OpenPictureDialog1: TOpenPictureDialog; Label14: TLabel; Memo1: TMemo; Memo2: TMemo; SaveDialog1: TSaveDialog; OpenDialog1: TOpenDialog; procedure Button10Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin close; end; procedure TForm1.Button9click(Sender: TObject); begin Form2:= TForm2.Create(Application); Form2.Show; end; procedure TForm1.Button3Click(Sender: TObject); begin Pfad; end; procedure TForm1.Button10Click(Sender: TObject); begin Laden; Schreiben; end; end. ![]()
Delphi-Quellcode:
Unit 3, Formular für die Eingabe der Bilddaten:
unit Unit2;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm2 = class(TForm) Edit13: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; Edit10: TEdit; Label1: TLabel; Label2: TLabel; ComboBox1: TComboBox; ComboBox2: TComboBox; ComboBox3: TComboBox; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; ComboBox6: TComboBox; Label12: TLabel; Label13: TLabel; Label14: TLabel; ComboBox8: TComboBox; Label15: TLabel; RadioGroup1: TRadioGroup; Label16: TLabel; Button1: TButton; Button2: TButton; Button3: TButton; Edit1: TEdit; Edit8: TEdit; Label17: TLabel; Edit9: TEdit; Edit11: TEdit; Label18: TLabel; Edit12: TEdit; procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.Button3Click(Sender: TObject); begin close; end; end. ![]()
Delphi-Quellcode:
Unit Pfadkopie
unit Unit3;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm3 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel; Label15: TLabel; Edit13: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit; Edit7: TEdit; ComboBox2: TComboBox; ComboBox3: TComboBox; ComboBox6: TComboBox; Button1: TButton; Button2: TButton; Button3: TButton; Label18: TLabel; Memo1: TMemo; Edit1: TEdit; Edit8: TEdit; Label19: TLabel; Edit9: TEdit; Label14: TLabel; Label20: TLabel; Edit10: TEdit; GroupBox1: TGroupBox; Label17: TLabel; ComboBox1: TComboBox; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form3: TForm3; implementation uses unit1, Pfadkopie; {$R *.dfm} procedure TForm3.Button3Click(Sender: TObject); begin Form1.enabled := true; close; end; procedure TForm3.Button1Click(Sender: TObject); begin Pfad; end; procedure TForm3.Button2Click(Sender: TObject); begin Einlesen; Speichern; close; end; end.
Delphi-Quellcode:
Das Problem mit der Suche ist jetzt erstmal noch nebensächlich. Eine verbesserte Programmstruktur wäre natürlich super und dann würde ich wie gesagt gerne das Problem anpacken, das jeder Nutzer in einer Datei seine "Datenbank" an Bilddaten Speichern und laden könnte. In den Memofeldern unten soll immer nur der derzeitig ausgewählte oder gerade eingegebene Datensatz erscheinen. Im Panel darüber das zugehörige Bild. Mit dem einen Datensatz klappt das auch recht gut. Der Button Bild aus Liste soll dann noch ein neues Formular mit einer ListBox aufrufen, aus dem der User dann den jeweilig gesuchten Datensatz über den Titel aufrufen können soll, sodass der zugehörige Datensatz (zum gewählten Titel) dann wieder in den Memofelder in Form1 zu sehen ist.
unit Pfadkopie;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, jpeg, ExtDlgs; type Bilddaten = record RTitel, RAutor, RThema, RAufnahmekontext, RBlende, RBZ1, RBZ2, RBG1, RBG2, RAuflösung, RSchlagworte, RBeschreibung, RDat1, RDat2, RDat3, RAFormat, RPfad, RFormat: string[100]; end; procedure Pfad; procedure Einlesen; procedure Speichern; procedure Laden; procedure Schreiben; var Datensatz: Bilddaten; implementation uses unit1, unit3; procedure Pfad; var Zieldatei: string; begin if Form1.OpenPictureDialog1.Execute then begin Form3.close; ZielDatei:= Form1.OpenPictureDialog1.FileName; Form1.Image2.Picture.LoadFromFile(Zieldatei); Form1.image2.Stretch:= true; Form1.image2.proportional:=true; Form1.image2.show; Form1.Enabled := false; Form3:= TForm3.Create(Application); Form3.Show; Form3.Label20.Caption:= ExtractFileExt(Zieldatei); Form3.Label17.Caption:= Zieldatei; end; end; procedure Einlesen; begin Datensatz.RTitel:= Form3.Edit13.Text; Datensatz.RAutor:= Form3.Edit2.Text; Datensatz.RThema:= Form3.Edit3.Text; Datensatz.RAufnahmekontext:= Form3.Edit4.Text; Datensatz.RBlende:= Form3.Edit1.Text; Datensatz.RBZ1:= Form3.Edit8.Text; Datensatz.RBZ2:= Form3.Edit9.Text; Datensatz.RBG1:= Form3.Edit5.Text; Datensatz.RBG2:= Form3.Edit6.Text; Datensatz.RAuflösung:= Form3.Edit10.Text; Datensatz.RSchlagworte:= Form3.Edit7.Text; Datensatz.RBeschreibung:= Form3.Memo1.Text; Datensatz.RDat1:= Form3.ComboBox1.Text; Datensatz.RDat2:= Form3.ComboBox2.Text; Datensatz.RDat3:= Form3.ComboBox3.Text; Datensatz.RAFormat:= Form3.ComboBox6.Text; Datensatz.RPfad:= Form3.Label17.Caption; Datensatz.RFormat:= Form3.Label20.Caption; Form1.Memo1.Text:= 'Titel: '+Datensatz.RTitel+#13#10+#13#10+ 'Aufnahmedatum: '+Datensatz.RDat1+Datensatz.RDat2+Datensatz.RDat3+#13#10+#13#10+ 'Autor: '+Datensatz.RAutor+ #13#10+#13#10+'Thema: '+Datensatz.RThema+#13#10+#13#10+ 'Aufnahmekontext: '+Datensatz.RAufnahmekontext+#13#10+#13#10+ 'Blende: '+Datensatz.RBlende+' mm'+#13#10+#13#10; Form1.Memo2.Text:= 'Belichtungszeit: '+Datensatz.RBZ1+'/'+Datensatz.RBZ2+'s'+#13#10+#13#10+ 'Bildgröße: '+Datensatz.RBG1+' x '+Datensatz.RBG2+''+DAtensatz.RAFormat+#13#10+#13#10+ 'Auflösung: '+Datensatz.RAuflösung+#13#10+#13#10+ 'Schlagworte: '+Datensatz.RSchlagworte+#13#10+#13#10+ 'Pfad: '+Datensatz.RPfad+#13#10+#13#10+ 'Dateiformat: '+Datensatz.RFormat; Form1.Label14.Caption:= Datensatz.RBeschreibung; Form1.Enabled:= true; end; procedure Speichern; var datei: file of Bilddaten; i: integer; begin if Form1.Savedialog1.Execute then begin try assignfile(Datei,Form1.Savedialog1.FileName); rewrite(datei); write(datei); finally closefile(datei); end; end; end; procedure Laden; var Datei: file of Bilddaten; begin if Form1.OpenDialog1.Execute then begin assignfile(datei, Form1.OpenDialog1.FileName); reset(datei); read(Datei, Datensatz); closefile(datei); end; end; procedure Schreiben; begin Form1.Image2.Picture.LoadFromFile(Datensatz.RPfad); Form1.image2.Stretch:= true; Form1.image2.proportional:=true; Form1.image2.show; Form1.Memo1.Text:= 'Titel: '+Datensatz.RTitel+#13#10+#13#10+ 'Aufnahmedatum: '+Datensatz.RDat1+Datensatz.RDat2+Datensatz.RDat3+#13#10+#13#10+ 'Autor: '+Datensatz.RAutor+ #13#10+#13#10+'Thema: '+Datensatz.RThema+#13#10+#13#10+ 'Aufnahmekontext: '+Datensatz.RAufnahmekontext+#13#10+#13#10+ 'Blende: '+Datensatz.RBlende+' mm'+#13#10+#13#10; Form1.Memo2.Text:= 'Belichtungszeit: '+Datensatz.RBZ1+'/'+Datensatz.RBZ2+'s'+#13#10+#13#10+ 'Bildgröße: '+Datensatz.RBG1+' x '+Datensatz.RBG2+''+DAtensatz.RAFormat+#13#10+#13#10+ 'Auflösung: '+Datensatz.RAuflösung+#13#10+#13#10+ 'Schlagworte: '+Datensatz.RSchlagworte+#13#10+#13#10+ 'Pfad: '+Datensatz.RPfad+#13#10+#13#10+ 'Dateiformat: '+Datensatz.RFormat; Form1.Label14.Caption:= Datensatz.RBeschreibung; end; end. Vielen Dank schonmal im Voraus für eure Weisheiten :) Liebe Grüße Giertier |
Re: Ausgabe eines geladenen Records in Memofeldern
[OT]
Da hat sich ein sachlicher Fehler eingeschlichen... Auf den letzten beiden Forms meinst du, wenn du "mm" als Einheit angibst sicherlich die Brenweite, oder? Die Blende hat i.d.R. keine Einheit und wird z.B. so angegeben: f3,5 ;) [/OT] edit: Auch wenn du es im Moment noch nicht um setzen können wirst(??), kannst du es ja mal im Hinterkopf behalten: Richtig gut wäre es, wenn du die Bilddaten aus den Exif-Metadaten eines Bildes auslesen könntest...:) |
Re: Ausgabe eines geladenen Records in Memofeldern
Hallo Giertier,
ich schau's mir heute Abend mal in Ruhe an (aber vielleicht kommen ja schon vorher von Anderen Verbesserungsvorschläge) |
Re: Ausgabe eines geladenen Records in Memofeldern
:o ich werds mir nachher auch mal ansehen. sieht aber auf jeden fall interessant aus.
|
Re: Ausgabe eines geladenen Records in Memofeldern
Zitat:
Das mit den Exif-Metadaten sagt mir leider überhaupt nix :oops: Wie gesagt, ich bin nichtso fit, was Delphi angeht :oops: Aber danke erstmal an alle dafür, dass ihr mir helfen wollt :). Find ich echt klasse. Ich freu mich auf eure Vorschläge :-) |
Re: Ausgabe eines geladenen Records in Memofeldern
Hallo Giertier.
Hab's mir jetzt einmal ausführlicher angesehen: Die Oberfläche schaut ja schon mal interessant und recht "aufgeräumt" aus - sehr schön! Nur der Programmcode ist leider (zumindest für mich) sehr schwer lesbar - und vermutlich wird es dir selbst in einiger Zeit ebenso gehen. Da sollte also unbedingt grundlegendes bereinigt werden. Das Programm bietet sicherlich eine Menge Ausbaupotential. Mit zunehmenden Fähigkeiten könnte es also sein, das du über längere Zeit das Programm weiterentwickelst. In diesem Fall ist es sehr wertvoll, wenn die Basis dafür vorbereitet ist. Sonst macht es einfach keinen Spaß daran zu arbeiten. Ich empfehle daher, dass du zunächst einmal aussagekräftige Namen für die Formulare und die darauf abgelegten Controls verwendest. Die automatische Namensvergabe macht bereits diesen sehr kurzen Quelltext zur Qual, also z.B. buSave (=Button Speichern), gbImageData (=Groupbox Bilddaten) etc. Die Namen geben also einen Hinweis, um welchen Typ von Control es sich handelt und welche Funktion damit verbunden ist - als Hobbyprogrammierer kann man da seiner Kreativität freien Lauf lassen und muss sich nicht sklavisch an einen StyleGuide halten. Wichtig ist nur, dass man die eigene Regelung auch konsequent einhält. Auch wenn es dich zunächst erst einmal nicht voranbringt: Fang erst einmal damit an. Später zahlt es sich aus und du kannst deutlich effizienter weiterarbeiten! Der nächste Schritt ist dann die Neuformulierung deiner Unit4 - daraus sollte eine eigen Klasse gemacht werden, die den kompletten FileI/O und die Datenhaltung kapselt. Diese Klasse "kennt" die übrigen Units gar nicht. Alle Form-Units übergeben die Daten an diese Klasse bzw. holen die Daten über spezielle Methoden daraus ab. Wenn du magst, helfe ich dir dabei gern weiter. // Frage an die Moderatoren: Langsam aber sicher entfernen wir uns ja nun von der ursprünglichen Fragestellung. Andererseits sind m.E. die Basics zunächst einmal wichtiger. Können wir diese schrittweise Optimierung in diesem Thread vollziehen, oder soll an dieser Stelle abgebrochen werden? |
Re: Ausgabe eines geladenen Records in Memofeldern
Hallo taaktaak,
deine Hilfe nehme ich sehr gerne in Anspruch :). Werde jetzt erstmal die Buttons und den ganzen Kram umbenennen, wie du's geschrieben hast. Bei dem Erstellen einer Klasse haperts dann schon wieder :oops: Hab ich noch nie gemacht :oops: . Ich denke auch, dass es vielleicht besser wär, das Problem jetzt nicht mehr in diesem Thread zu diskutieren, hat ja fast nichts mehr mit dem eigentlichen Thema zu tun. Liebe Grüße und vielen Dank Giertier :) |
Re: Ausgabe eines geladenen Records in Memofeldern
Hallo Giertier.
Ok, einverstanden, dann machen wir außerhalb des Threads weiter. Wir verabreden dann per PN wie der Source ausgetauscht wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 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