Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmvorbereitung - Hilfe benötigt!
Expresseon
27.10.2007, 18:43
Ich möchte ein Programm erstellen, dass Rechnungen selber erzeugt. Ich verwende Borland Delphi 6. Eigentlich möchte ich nur wissen: Ist es möglich, aus Informationen, die ein Benutzer des Programms in Felder eingibt, automatisch ein (Word-)Dokument zu generieren, oder gegebenfalls die eingegebenen Informationen auf eine andere Art und Weise ausdrucken? Danke im Vorraus, habe noch andere Fragen, die später kommen!
Crash-Override
27.10.2007, 19:28
http://dsdt.info/tipps/?id=610
http://dsdt.info/tipps/?id=552
http://dsdt.info/tipps/?id=347
Du wirst es nicht glauben, aber es hat nur 2 Minuten gekostet das selbst zu suchen.
Expresseon
27.10.2007, 20:09
Ich bin noch keineswegs fortgeschritten und komme nicht klar mit den Anweisungen (vom 1. Link). Nicht vergessen, dass ich Delphi 6 verwende. Das müsste aber in 1. Linie nicht das Problem sein, denke ich. Man muss doch die Typbibliothek importieren, oder? Wie geht das?
Crash-Override
28.10.2007, 10:55
Man muss doch die Typbibliothek importieren, oder? Wie geht das?
Du schreibst sie, durch Kommas abgetrennt hinter uses. In diesem Falle müsstest du "ComObj, ActiveX, Word_TLB" ans Ende hinzufügen. Diese "uses" Teile entsprechen dem "#include" aus C/C++.
Expresseon
28.10.2007, 15:37
Es tritt immer der Fehler auf, dass Word_TBL nicht gefunden wurde!
Nur mal so ne kleine Frage am Rande:
Wieso nutzt du nicht Access dafür? Sollte mit nem Datenbankprogramm wie diesen ein leichtes sein eine Kundenverwaltung/Bestellverwaltung einzurichten und am Ende die jeweiligen Rechnungen zu erstellen. Ausdrucken kannst dus dann am Ende auch noch wunderbar. Aber naja, du willst ja was programmieren denk ich mal....
WORD_TLB kann nicht gefunden werden.. uh... der findet die Typenbibliothek davon nicht. Hast du Word überhaupt installiert?
Expresseon
28.10.2007, 17:02
Klar, Word 2000 ist installiert. Mal etwas anderes: Acces ist ein Windows-Programm oder? Ist es normalerweise auf dem Betriebssystem vorinstalliert, also auf Win XP? Oder ist es kostenlos zu haben? Oder gibt es eventuell eine Alternative, z.B. von Office? Interessiert mich nur mal, aber natürlich möchte ich auch selber programmieren.
Klar, Word 2000 ist installiert. Mal etwas anderes: Acces ist ein Windows-Programm oder? Ist es normalerweise auf dem Betriebssystem vorinstalliert, also auf Win XP? Oder ist es kostenlos zu haben? Oder gibt es eventuell eine Alternative, z.B. von Office? Interessiert mich nur mal, aber natürlich möchte ich auch selber programmieren.
Access ist ein Teil von MS Office(Also es ist kostenpflichtig).
Alternativ gibt es auch noch OpenOffice.org Base. Ich kann jetzt nicht sagen ob es die selbe Funktionalität hat, aber du kannst es ja mal testen.
Expresseon
28.10.2007, 17:44
Naja OpenOffice.org Base scheint mir nicht fürs Anfertigen von Rechnungen gemacht. Mir reicht es ja, wenn ich einen funktionierenden Druckbefehl für BD 6 habe.
Gestalte die Rechnungen doch mit html. Dann kannst du sie ganz einfach über den Browser ausdrucken.
Also mach in deinem Programm irgendwie nen Button "Rechnung Anzeigen/Drucken", wenn du da drauf klickst öffnet sich ein Browserfenster wo der generierte html Code drinne steht.
Expresseon
29.10.2007, 14:26
Ich kann kein html. o.Ô
Ist das über Delphi so kompliziert?
Also die Grundlagen für html für ein simples Rechnungslayout sollte man schnell gelernt haben, daran würde es wohl nicht scheitern. Würde schon fast reichen mit Tabellen umgehen zu können.
Alles was du dafür brauchst kannst du hier lernen: http://de.selfhtml.org/
@Delphi:
Weis nicht, hab noch nie was mit Delphi gemacht, sollte nur ein vorschlag sein, weil die die anderen Sachen hier ja scheinbar noch nicht geholfen haben.
dead_orc
29.10.2007, 14:54
Wenn du kein HTML lernen willst kannst du es auch in LaTeX machen, was aber wahrscheinlich schwerer würde. Beides aber noch einfacher als ne Excel-Datei (Excel eignet sich sehr viel besser für Rechnungen als Access ;) ) zu erstellen, vermute ich.
Expresseon
29.10.2007, 16:53
Dann werde ich es mit Delphi aufgeben müssen... Der Sinn des Ganzen war zwar komplett anders gedacht, nämlich dass ich eben das Programm schreibe, als Übung, nicht für einen bestimmten Verwendungszweck. Dafür habe ich den Druckbefehl benötigt. Wenn ich irgendwann mal Rechnungen schreiben muss, verwende ich Excel. §laugh
Crash-Override
29.10.2007, 17:34
Dann werde ich es mit Delphi aufgeben müssen... Der Sinn des Ganzen war zwar komplett anders gedacht, nämlich dass ich eben das Programm schreibe, als Übung, nicht für einen bestimmten Verwendungszweck. Dafür habe ich den Druckbefehl benötigt. Wenn ich irgendwann mal Rechnungen schreiben muss, verwende ich Excel. §laugh
Und die Links die ich oben geposted habe hast du dann mal schön ignoriert, den andernfalls hättest du gemerkt das du in Delphi Drucker ganz simpel über Canvas benutzen kannst.
Expresseon
30.10.2007, 10:49
Ich habe sie angesehen und ausprobiert, dann habe ich nach einer genaueren Anweisung gefragt, aber leider keine bekommen. Irgendwie hat es nicht funktioniert.
Crash-Override
30.10.2007, 15:06
Ich habe sie angesehen und ausprobiert, dann habe ich nach einer genaueren Anweisung gefragt, aber leider keine bekommen. Irgendwie hat es nicht funktioniert.
Ernsthaft? Ich hätte nicht gedacht das du das nicht hinbekommst. Binde einfach "Printers" als unit ein und dann kannst du das hier probieren:
Printer.Title := 'Test Document';
Printer.BeginDoc;
// Jetzt ein paar Canvas Samples
Printer.Canvas.TextOut(100, 100, 'This is a test!');
Printer.Canvas.Font.Style := [fsBold];
Printer.Canvas.TextOut(150, 400, 'Fett');
Printer.Canvas.Ellipse(200, 200, 250, 300);
// Und drucken:
Printer.EndDoc;
Benutzt wird der Standard-Drucker. Getestet mit Delphi 7 und PDFCreator als Standard-Drucker. Hier mal das Ergebnis: http://npshare.de/files/35/9626/Test%20Document.pdf
Expresseon
31.10.2007, 20:57
Sorry, ich habe echt noch zu wenig Ahnung. Wo und wie soll ich "Printer" als Unit einbinden?
Crash-Override
31.10.2007, 21:21
Sorry, ich habe echt noch zu wenig Ahnung. Wo und wie soll ich "Printer" als Unit einbinden?
da wo "uses" ganz oben in deinem Quelltext steht. Einfach noch Printers mit einem Komma anhängen (vor ; natürlich).
Expresseon
01.11.2007, 13:16
Den Sinn hab ich jetzt verstanden, allerdings sucht Delphi dabei nach Printer.dcu, was er nicht findet und als Fehler ausgibt.
Crash-Override
01.11.2007, 15:50
Den Sinn hab ich jetzt verstanden, allerdings sucht Delphi dabei nach Printer.dcu, was er nicht findet und als Fehler ausgibt.
Binde eben "Printers" ein, habs ja oben schon genannt, nur dann im letzten Post falsch geschrieben.
Expresseon
01.11.2007, 17:18
Schon besser, jetzt liegt der Fehler aber im geposteten Code bei Printer (unknown directive).
Crash-Override
01.11.2007, 22:00
http://npshare.de/files/35/8589/Delphi%20Printing%20Example.rar
So, hier mal ein Beispiel inc. source und binary.
Expresseon
02.11.2007, 10:25
Danke! Später kommen vielleicht nochmal Fragen auf, im Moment klappt es aber. Wo finde ich eigentlich PrinterDialog und FontDialog in Delphi?
Edit: Wie kann ich jetzt den Text einer weiteren Memo zum Druckvorgang hinzufügen? Benötigt man eine neue Variable?
Crash-Override
02.11.2007, 11:29
Danke! Später kommen vielleicht nochmal Fragen auf, im Moment klappt es aber. Wo finde ich eigentlich PrinterDialog und FontDialog in Delphi?
Edit: Wie kann ich jetzt den Text einer weiteren Memo zum Druckvorgang hinzufügen? Benötigt man eine neue Variable?
genauso wie beim ersten, du musst halt nur den vertikalen Offset (500) erhöhen, damit sie sich nicht überschneiden. Die Dailoge findest du im gleichnamigen Register (bzw. Dialogs in der englischen Version).
Expresseon
02.11.2007, 12:02
begin
Printer.Canvas.TextOut(500, 1000 + I *
(Printer.Canvas.TextHeight('I') + 5), memText1.Lines[I], memText2-Lines[I]);
end;
So? Wofür wird denn eigentlich die Variable I eingesetzt?
Crash-Override
02.11.2007, 12:04
begin
Printer.Canvas.TextOut(500, 1000 + I *
(Printer.Canvas.TextHeight('I') + 5), memText1.Lines[I], memText2-Lines[I]);
end;
So? Wofür wird denn eigentlich die Variable I eingesetzt?
I steht immer für die aktuelle Zeile (beginnend bei 0) in meinem Code. Um auszurechnen wohin de Text kommen muss ist die Formel I*(ZeilenHöhe + 5), damit sich der Text nicht überschneidet. Die +5 ist nur damit die Zeilen nicht so aneinander kleben.
Dein Code ist übrigens schwachsinn. Probiere es mal lieber so:
procedure TfrmMain.btnPrintClick(Sender: TObject);
var
I, J: Integer;
begin
if PrintDialog.Execute then
begin
try
Printer.Copies := printDialog.Copies;
Printer.Title := 'Document';
Printer.BeginDoc;
// Setze Schriftart
Printer.Canvas.Font := FontDialog.Font;
// Zeilenweißes drucken
for I := 0 to memText.Lines.Count - 1 do
begin
Printer.Canvas.TextOut(500, 500 + I *
(Printer.Canvas.TextHeight('I') + 5), memText.Lines[I]);
end;
for J := 0 to memText2.Lines.Count - 1 do
begin
Printer.Canvas.TextOut(500, 500 + J * (Printer.Canvas.TextHeight('I') + 5) + I * (Printer.Canvas.TextHeight('I') + 5),
(Printer.Canvas.TextHeight('I') + 5), memText2.Lines[J]);
end;
// Und drucken:
Printer.EndDoc;
except
MessageDlg('Error while printing!', mtError, [mbOk], 0);
end;
end;
end;
Expresseon
02.11.2007, 15:12
Das verursacht einen Fehler:
(Printer.Canvas.TextHeight('I') + 5), memText2.Lines[J]);
Irgendein Problem zwischen String und Integer... Wieso tritt das bei I nicht auf?
Crash-Override
02.11.2007, 15:18
Das verursacht einen Fehler:
(Printer.Canvas.TextHeight('I') + 5), memText2.Lines[J]);
Irgendein Problem zwischen String und Integer... Wieso tritt das bei I nicht auf?
Lösch "(Printer.Canvas.TextHeight('I') + 5)," dann gehts, hab den code übersehen.
Expresseon
02.11.2007, 16:03
Vielen Dank für das mit dem Drucken, habe weitere Fragen. Zuerst die totale Noobfrage: Wie kann ich den Text, der in einer Memo dem Name der Memo angepasst wird, löschen? Dann eine Frage zu den Dialogs: Es gibt ja auch einen Save Dialog. Wie baue ich den ein, um die gesamte Form und alle Informationen als Datei abzuspeichern, bzw. mit dem Open Dialog zu laden?
Crash-Override
02.11.2007, 17:07
Vielen Dank für das mit dem Drucken, habe weitere Fragen. Zuerst die totale Noobfrage: Wie kann ich den Text, der in einer Memo dem Name der Memo angepasst wird, löschen?
Wie du dem Code entnehmen kannst greift man ist der Inhalt repräsentiert durch das Objekt Lines (TStrings).
Dann eine Frage zu den Dialogs: Es gibt ja auch einen Save Dialog. Wie baue ich den ein, um die gesamte Form und alle Informationen als Datei abzuspeichern, bzw. mit dem Open Dialog zu laden?
Beide, Open- und Savedialog, können mit einer If-Abfrage und ihrer Funktion Execute ausgeführt werden. Der Rückgabewert ist dann bei Beiden in der property "FileName" zu finden. Beispielsweiße:
If SaveDialog.Execute then // Wenn User abgebrochen hat, dann nicht ausführen, sonst weiter
begin
SaveDialog.FileName := ChangeFileExt(SaveDialog.FileName, '.txt');
// Nur zur sicherheit ändern, sonst gibts manchmal Fehler
memText.Linex.SaveToFile(SaveDialog.FileName);
end;
Speichern einer kompletten Form kannst du natürlich als fertige Funktion vergessen, man kann nicht jedes Objekt einfach so in eine Datei speichern. Zu diesem Thema kannst du dir mal INI und XML ansehen. Auch typisierte Dateien ("records") lassen sich wunderbar speichern. Ist zwar ein wenig OldSchool und nur zu empfehlen wenn du sicher bist das nur (d)ein Delphi Programm die Daten jemals nutzen muss.
An dieser Stelle moechte ich auch einfach mal auf die ausgezeichnete kontextsensitive Hilfe von Delphi verweisen. Meinerzeit habe ich ohne Handbuch, Tutorials oder Internet Delphi ausschliesslich ueber seine Hilfefunktion gelernt.
Strg + F1 auf einem bestimmten Wort im Quelltext, einer Property im Object Inspector oder einem Icon in einem der Reiter und man hat eine wunderbare Hilfe mit Erklaehrung der funktionalitaet, aller Eigenschaften und Methoden und teilweise sogar Beispielquelltexte.
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.