![]() |
[gelöst] Lazarus: StringGrid drucken
Moin,
jetzt suche ich schon seit 2 Tage nach einer funktionierenden Funktion um aus Lazarus heraus ein
Delphi-Quellcode:
auszudrucken.
Stringgrid
Ich schätze 99% der Treffer haben den Quellcode untereinander kopiert oder verlinkt. Gefunden habe ich:
Aber, entweder brechen die mit einem "ARG..."-Fehler ab oder sie benutzen Typen die von Irgendwo her kommen und deren
Delphi-Quellcode:
man vergessen hat anzugeben.
Uses
Außerdem scheinen die alle eher für altes Delphi als für aktulles Lazarus zu sein. Ich will keine riesige
Delphi-Quellcode:
mit x-Schaltern, sondern nur auf den Standard-Drucker ausdrucken.
Procedure
Wer kann helfen? Gruß Heiko |
AW: Lazarus: StrinfGrid drucken
Was genau willst Du drucken? Wenn wirklich das StringGrid, mach einen Screenshot, schneide das StringGrid-Rechteck daraus aus und schicke es an den Drucker. Oder soll eher der Inhalt des Grids gedruckt werden? Da scheint mir der erste verlinkte Code doch ganz gut geeignet, was für Fehler kommen denn da? Alternativ kannst Du auch auf eine Reporting-Engine ausweichen, ich weiß gerade nicht, ob Lazarus da schon etwas an Bord hat.
|
AW: Lazarus: StrinfGrid drucken
Hallo DeddyH,
Zitat:
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
bearbeitet haben und das Programm alles das macht was es soll, weiß ich nicht wieso jetzt schon weider so ein "SEGxxx"-Fehler kommt.
StringList.Free
Beim Debug komme ich genau bis zur Zeile
Delphi-Quellcode:
.
Printer.Title := sTitle;
Muss also eine Fehler in "Printers" sein - oder? Zitat:
Gruß Heiko |
AW: Lazarus: StringGrid drucken
Woher kommt denn sTitle? Im ersten Beispielcode heißt das Title und ist ein Parameter, der an die Druckroutine übergeben wird.
|
AW: Lazarus: StringGrid drucken
Moin,
Zitat:
Delphi-Quellcode:
procedure PrintGrid(sGrid: TStringGrid; sTitle: string);
var X1, X2: Integer; Y1, Y2: Integer; TmpI: Integer; F: Integer; TR: TRect; begin Printer.Title := sTitle;
Delphi-Quellcode:
sTitle ist einer der beiden Übergabeparameter.
procedure TForm1.MI_DruckenClick(Sender: TObject);
begin PrintGrid(StringGrid1, 'Print Stringgrid'); end; Upps, habe den Code aus dem falschen Browserfenster übernommen. Moment ich binde den anderen nochmal ein ... Gruß HEiko |
AW: Lazarus: StringGrid drucken
Und wenn Du die Zeile auskommentierst, knallt es beim nächsten Zugriff auf die Printer-Variable? In dem Fall scheint es unter Lazarus tatsächlich etwas anders zu sein als unter Delphi.
|
AW: Lazarus: StringGrid drucken
Was kommen denn für Code-Zeilen nach
Code:
?
Printer.Title := sTitle;
|
AW: Lazarus: StringGrid drucken
So, jetzt habe ich den anderen Code eingebunden und bei dem kennt Lazarus
Delphi-Quellcode:
nicht.
GetDeviceCaps
Delphi-Quellcode:
Gruß Heiko
//Druck auf mm einstellen
mmx := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) / GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) * 25.4; mmy := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALHEIGHT) / GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) * 25.4; |
AW: Lazarus: StringGrid drucken
Die Unit Windows (oder wie die auch sonst heißen mag) ist eingebunden?
|
AW: Lazarus: StringGrid drucken
Moin,
Zitat:
und springt in Printers an diese Stelle:
Delphi-Quellcode:
Heiko
//Raise error if Printer.Printing is not Value
procedure TPrinter.CheckPrinting(Value: Boolean); begin if Printing<>Value then begin if Value then raise EPrinter.Create('Printer is not printing') else raise Eprinter.Create('Printer is printing'); end; end; |
AW: Lazarus: StringGrid drucken
Zitat:
|
AW: Lazarus: StringGrid drucken
Bei BeginDoc kommt eine Exception, weil sich der Status auf Drucken ändert? Das kann ich kaum glauben. Natürlich ist auch Lazarus nicht fehlerfrei (genau wie Delphi), aber das wäre schon ein dicker Hund.
|
AW: Lazarus: StringGrid drucken
Moin,
Zitat:
Gruß Heiko |
AW: Lazarus: StringGrid drucken
Was denn für eine Suchroutine? Ich kann Dir nicht folgen.
|
AW: Lazarus: StringGrid drucken
Moin,
Zitat:
Zitat:
Delphi-Quellcode:
FindClose (FindRecord);
|
AW: Lazarus: StringGrid drucken
Ah, sag das doch gleich. Qualifizier das mal mit
Delphi-Quellcode:
[edit] Oder Windows vor SysUtils einbinden, sollte auch funktionieren. [/edit]
SysUtils.FindClose(FindRecord);
|
AW: Lazarus: StringGrid drucken
Moin,
Zitat:
Delphi-Quellcode:
Gruß Heiko
Procedure FindFiles (aPath, aFindMask: String; aWithSub: Boolean; aResult: tStrings);
Var FindRecord: tSearchRec; tempstr: String; Begin // Form1.StatusBar1.SimpleText:='Starte die Suche ...'; // // Quelle: http://www.entwickler-ecke.de/topic_nach+Dateien+suchen_1107,0.html // // Wenn die Stringliste nil ist oder aPath oder aFind nicht angegeben ist // dann raus If (aPath = '') or (aFindMask = '') or Not Assigned (aResult) Then Exit; // Wenn am Ende der Pfadangabe noch kein \ steht, dieses hinzufügen // (Oder die Funktion IncludeTrailingPathDelimiter aus der Unit SysUtils.pas verwenden) If aPath[Length (aPath)] <> '\' Then aPath := aPath + '\'; // Im aktuellen Verzeichnis nach der Datei suchen If FindFirst (aPath + aFindMask, faAnyFile, FindRecord) = 0 Then Repeat begin If (FindRecord.Name <> '.') and (FindRecord.Name <> '..') Then // ...Ergebnis in die Stringlist einfügen // Gesammter Zugriffspfad incl. Dateiname und Extention darf nicht länger als 160 Zeichen sein if length(aPath + FindRecord.Name) > 160 then Begin tempstr:= aPath + ','+ FindRecord.Name +',Zugriffpfad zu lang! Länge: '+InttoStr(length(aPath + FindRecord.Name))+' (max. 160)'; aResult.Add (tempstr); end; // Probleme bei der erneuten Archivierung if length(aPath + FindRecord.Name)+40 > 160 then Begin tempstr:= aPath + ','+ FindRecord.Name +',Erneute Archivierung nicht möglich!'; aResult.Add (tempstr); end; // Der Dateiname darf nicht länger als 32 Zeichen sein if length(FindRecord.Name) > 32 then Begin tempstr:= aPath + ','+ FindRecord.Name +',Projektname zulang! Länge: '+InttoStr(length(FindRecord.Name))+' (max. 32)'; aResult.Add (tempstr); //(aPath + FindRecord.Name); end; // Der Pfad darf nicht länger als 128 Zeichen sein if length(aPath) > 128 then Begin tempstr:= aPath + ','+ FindRecord.Name +',Projektpfad zulang! Länge: '+InttoStr(length(aPath))+' (max. 128)'; aResult.Add (tempstr); //(aPath + FindRecord.Name); end; // Es dürfen nur bestimmte Zeichen im Dateinamen sein if HatStringSonderzeichen(KillExt(FindRecord.Name)) then Begin tempstr:= FindRecord.Name +',Sonderzeichen im Projektnamen!!!'; aResult.Add (aPath+','+tempstr); //(aPath + FindRecord.Name); end; Form1.StatusBar1.SimpleText:='Suche ...'; Form1.StatusBar1.Refresh; end; Until FindNext (FindRecord) <> 0; FindClose (FindRecord); // Wenn nicht in Unterverzeichnissen gesucht werden soll dann raus If Not aWithSub Then Exit; // In Unterverzeichnissen weiter suchen If FindFirst (aPath + '*.*', faAnyFile, FindRecord) = 0 Then Repeat If (FindRecord.Name <> '.') and (FindRecord.Name <> '..') Then // Feststellen, ob es sich um ein Verzeichnis handelt If Boolean (FindRecord.Attr and faDirectory) Then // Funktion erneut aufrufen, um Verzeichnis zu durchsuchen (Rekursion) FindFiles (aPath + FindRecord.Name, aFindMask, aWithSub, aResult); Until FindNext (FindRecord) <> 0; FindClose (FindRecord); Form1.StatusBar1.SimpleText:='Die Suche ist Beendet'; End; |
AW: Lazarus: StringGrid drucken
Siehe meine letzte Antwort, da haben sich die Posts überschnitten.
|
AW: Lazarus: StringGrid drucken
Moin,
Zitat:
Delphi-Quellcode:
TR := Rect(X1,
Zitat:
|
AW: Lazarus: StringGrid drucken
Die Rect-Funktion steht IIRC in Types.pas, also wieder voll qualifizieren: Types.Rect.
|
AW: Lazarus: StringGrid drucken
Irgendwie scheinen die Druck und die Suchfunktionen nicht sauber zu sein, so das man sie nicht einfach einbinden kann.
@ DeddyH: Jetzt bekomme ich keine Syntax-fehler aber wieder den "SIGSEGV" |
AW: Lazarus: StringGrid drucken
Was steht in unit1.pas in der Zeile 252 ?
Die Druckfunktion von swiss funktioniert einwandfrei. Habe ich hier gerade mit Lazarus getestet. |
AW: Lazarus: StringGrid drucken
Zitat:
Delphi-Quellcode:
Y2 := 450;
Zitat:
Gruß heiko |
AW: Lazarus: StringGrid drucken
Zitat:
Schmeiss bitte einmal Deine gesamte Unit hoch. |
AW: Lazarus: StringGrid drucken
Zitat:
Delphi-Quellcode:
Und es gibt wieder ein "SIGSEGV" :twisted:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Grids, Types, Windows, Printers; type { TForm1 } TForm1 = class(TForm) Button1: TButton; StringGrid1: TStringGrid; procedure Button1Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} procedure PrintGrid(sGrid: TStringGrid; sTitle: string); var X1, X2: Integer; Y1, Y2: Integer; TmpI: Integer; F: Integer; TR: TRect; begin Printer.Title := sTitle; Printer.BeginDoc; Printer.Canvas.Pen.Color := 0; Printer.Canvas.Font.Name := 'Times New Roman'; Printer.Canvas.Font.Size := 12; Printer.Canvas.Font.Style := [fsBold, fsUnderline]; Printer.Canvas.TextOut(0, 100, Printer.Title); for F := 1 to sGrid.ColCount - 1 do begin X1 := 0; for TmpI := 1 to (F - 1) do X1 := X1 + 5 * (sGrid.ColWidths[TmpI]); Y1 := 300; X2 := 0; for TmpI := 1 to F do X2 := X2 + 5 * (sGrid.ColWidths[TmpI]); Y2 := 450; TR := Types.Rect(X1, Y1, X2 - 30, Y2); Printer.Canvas.Font.Style := [fsBold]; Printer.Canvas.Font.Size := 7; Printer.Canvas.TextRect(TR, X1 + 50, 350, sGrid.Cells[F, 0]); Printer.Canvas.Font.Style := []; for TmpI := 1 to sGrid.RowCount - 1 do begin Y1 := 150 * TmpI + 300; Y2 := 150 * (TmpI + 1) + 300; TR := Types.Rect(X1, Y1, X2 - 30, Y2); Printer.Canvas.TextRect(TR, X1 + 50, Y1 + 50, sGrid.Cells[F, TmpI]); end; end; Printer.EndDoc; end; procedure TForm1.Button1Click(Sender: TObject); begin PrintGrid(StringGrid1, 'Print Stringgrid'); end; end. |
AW: Lazarus: StringGrid drucken
Ich glaube mein Lazarus hat einen Schuß
|
AW: Lazarus: StringGrid drucken
So, habe jetzt nur Deinen Source in meine Unit kopiert und es funktioniert.
Allerdings musst Du vorher noch die Unit Types in die Uses-Klausel aufnehmen. |
AW: Lazarus: StringGrid drucken
Zitat:
Zitat:
Wäre es eigentlich zulässig und machbar die Uses direkt in die Units zu packen in den sie gebraucht werden? Wenn ja, würden die Uses in der Procedure die anderen Uses ersetzen oder ergänzen? Gruß Heiko |
AW: Lazarus: StringGrid drucken
kcontrols wäre auch eine Möglichkeit
![]() und wenn ich mich richtig entsinne hatte Lazreport auch ein Printgrid oder so ähnlich |
AW: Lazarus: StringGrid drucken
Zitat:
Zitat:
Ich hatte Deine Uses nicht übernommen. Habe zu Sicherheit aber nochmals getestet mit den von Dir eingebundenen Units, auch in der gleichen Reihenfolge. Und es funktioniert immer noch. Zitat:
|
AW: Lazarus: StringGrid drucken
[QUOTE=BadenPower;1290431]
Zitat:
Ich habe Lazarus jetzt komplett platt gemacht und neu installiert - Ergebis: keine Änderung. :cry: Gruß Heiko |
AW: Lazarus: StringGrid drucken
Kann es sein das ich für die Lazarus-Nutzung unter Windows irgendwelche Einstellungen Global oder in den Projekteinstellungen machen muß die jetzt zu den Problemen führen?
In meienm PC sind 32GB Ram verbaut, könnte das dass Problem sein? |
AW: Lazarus: StringGrid drucken
Zitat:
Benutze für Lazarus Windows XP und es geht. Was passiert genau, wenn Du den Code in #25 ausführst? Wie lautet die EXAKTE und KOMPLETTE Fehrlermeldung? Wie ist das Stringgrid eingestellt? Vor allem die Einstellungen RowCount, ColCount, FixedRows und FixedCols. |
AW: Lazarus: StringGrid drucken
Zitat:
Code:
Im Assembler wird :
Projekt project1 hat Exception-Klasse >>External: SIGSEGV<< ausgelöst. Bei Adresse 403B70
Code:
Angezeigt.
00403B70 833800 cmpl $0x0,(%eax)
00403B73 7501 jne 0x403b76 <fpc_ansistr_decr_ref+6> Zitat:
Delphi-Quellcode:
Gruß Heiko
object StringGrid1: TStringGrid
Left = 0 Height = 424 Top = 0 Width = 558 Align = alClient Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing, goAlwaysShowEditor, goSmoothScroll] TabOrder = 1 end |
AW: Lazarus: StringGrid drucken
Zitat:
Wenn ja, dann bin ich vorläufig raus und der Fehler müsste bei "Lazarus gegen Windows 8.1" zu suchen sein. |
AW: Lazarus: StringGrid drucken
Zitat:
Ich kann die Anwendung starten und Daten ins Grid eintragen, aber wehe ich starte den Ausdruck. |
AW: Lazarus: StringGrid drucken
Zitat:
Also das GANZE Projekt. Deine Zugriffsverletzungen kommen bestimmt wieder daher, dass Du zum x-ten mal auf etwas zugreifst, was nicht vorhanden ist. Ich vermute hier einfach einmal wieder, dass Du RowCount oder ColCount verändert hast, was in Deinen Schleifen dafür sorgt, dass Du wieder auf eine Zeile zugreift, welche nicht da ist. Die Vermutung bekomme ich, da in den geposteten Schleifen wieder bei 1 angefangen wird ohne Rücksicht auf FixedCols und FixedRows. Wie soll man denn einen Fehler lokalisieren, wenn die entsprechenden Daten verheimlicht werden??? |
AW: Lazarus: StringGrid drucken
Moin,
Zitat:
Der Code steht in Beitrag 25: ![]() Zitat:
Wenn diese minimalistische Version läuft, ich sie ins Projekt einbinde und es dann dort nicht geht, dann kommt das ganze Projekt erneut unter die Lupe. Zitat:
Ich hhabe nur die Druckprocedure ins Projekt kopiert und den Aufruf in Main-Menü eingebunden. Zitat:
Zitat:
Gruß HEiko |
AW: Lazarus: StringGrid drucken
Jetzt noch einmal ganz von vorne:
Wenn Du den Code in #25 ausführst, dann läuft das Programm. Das StringGrid1 ist komplett leer und RowCount ist 5 ColCount ist 5 FixedRows ist 1 FixedCols ist 1 wenn Du nun Button1 drückst, dann kommt der Fehler?
Delphi-Quellcode:
for F := 1 to sGrid.ColCount - 1 do // <- hier
begin X1 := 0; for TmpI := 1 to (F - 1) do // <- hier X1 := X1 + 5 * (sGrid.ColWidths[TmpI]); Y1 := 300; X2 := 0; for TmpI := 1 to F do // <- hier X2 := X2 + 5 * (sGrid.ColWidths[TmpI]); Y2 := 450; TR := Types.Rect(X1, Y1, X2 - 30, Y2); Printer.Canvas.Font.Style := [fsBold]; Printer.Canvas.Font.Size := 7; Printer.Canvas.TextRect(TR, X1 + 50, 350, sGrid.Cells[F, 0]); Printer.Canvas.Font.Style := []; for TmpI := 1 to sGrid.RowCount - 1 do // <- hier begin Y1 := 150 * TmpI + 300; Y2 := 150 * (TmpI + 1) + 300; TR := Types.Rect(X1, Y1, X2 - 30, Y2); Printer.Canvas.TextRect(TR, X1 + 50, Y1 + 50, sGrid.Cells[F, TmpI]); end; end; |
AW: Lazarus: StringGrid drucken
N'abend,
Zitat:
Zitat:
Zitat:
Deine Quellcode-Hinweise (der Code stammt ja nicht von mir und läuft ungeändert bei anderen) nehme ich mir nachher mal vor. Gruß Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 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 by Thomas Breitkreuz