Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   FreePascal [gelöst] Lazarus: StringGrid drucken (https://www.delphipraxis.net/183997-%5Bgeloest%5D-lazarus-stringgrid-drucken.html)

Kralle 18. Feb 2015 14:58


[gelöst] Lazarus: StringGrid drucken
 
Moin,

jetzt suche ich schon seit 2 Tage nach einer funktionierenden Funktion um aus Lazarus heraus ein
Delphi-Quellcode:
Stringgrid
auszudrucken.

Ich schätze 99% der Treffer haben den Quellcode untereinander kopiert oder verlinkt.

Gefunden habe ich:
  1. http://www.swissdelphicenter.ch/de/showcode.php?id=1577
  2. http://www.delphitricks.com/source-c...tringgrid.html
  3. https://sites.google.com/site/soundd...idmultilateral

Aber, entweder brechen die mit einem "ARG..."-Fehler ab oder sie benutzen Typen die von Irgendwo her kommen und deren
Delphi-Quellcode:
Uses
man vergessen hat anzugeben.
Außerdem scheinen die alle eher für altes Delphi als für aktulles Lazarus zu sein.

Ich will keine riesige
Delphi-Quellcode:
Procedure
mit x-Schaltern, sondern nur auf den Standard-Drucker ausdrucken.

Wer kann helfen?

Gruß Heiko

DeddyH 18. Feb 2015 15:05

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.

Kralle 18. Feb 2015 15:22

AW: Lazarus: StrinfGrid drucken
 
Hallo DeddyH,

Zitat:

Zitat von DeddyH (Beitrag 1290389)
Was genau willst Du drucken?

Den Inhalt des Grids mit waagerechten und senkrechten Linien.

Zitat:

Zitat von DeddyH (Beitrag 1290389)
Wenn wirklich das StringGrid, mach einen Screenshot, schneide das StringGrid-Rechteck daraus aus und schicke es an den Drucker.

Das Grid kann aber Höher und Breiter als der Bildschirm werden.

Zitat:

Zitat von DeddyH (Beitrag 1290389)
Da scheint mir der erste verlinkte Code doch ganz gut geeignet, was für Fehler kommen denn da?

Zitat:

Projekt ... hat eine Exception-Klasse >>External: SIGSEGV<< ausgelöst. Bei Adresse 403C60
Da wir ja nun gestern schon die Probleme mit dem
Delphi-Quellcode:
StringList.Free
bearbeitet haben und das Programm alles das macht was es soll, weiß ich nicht wieso jetzt schon weider so ein "SEGxxx"-Fehler kommt.
Beim Debug komme ich genau bis zur Zeile
Delphi-Quellcode:
 Printer.Title := sTitle;
.
Muss also eine Fehler in "Printers" sein - oder?

Zitat:

Zitat von DeddyH (Beitrag 1290389)
Alternativ kannst Du auch auf eine Reporting-Engine ausweichen, ich weiß gerade nicht, ob Lazarus da schon etwas an Bord hat.

Ich auch nicht.

Gruß Heiko

DeddyH 18. Feb 2015 15:34

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.

Kralle 18. Feb 2015 15:37

AW: Lazarus: StringGrid drucken
 
Moin,

Zitat:

Zitat von DeddyH (Beitrag 1290399)
Woher kommt denn sTitle? Im ersten Beispielcode heißt das Title und ist ein Parameter, der an die Druckroutine übergeben wird.

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:
procedure TForm1.MI_DruckenClick(Sender: TObject);
begin
  PrintGrid(StringGrid1, 'Print Stringgrid');
end;
sTitle ist einer der beiden Übergabeparameter.

Upps, habe den Code aus dem falschen Browserfenster übernommen. Moment ich binde den anderen nochmal ein ...

Gruß HEiko

DeddyH 18. Feb 2015 15:40

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.

BadenPower 18. Feb 2015 15:41

AW: Lazarus: StringGrid drucken
 
Was kommen denn für Code-Zeilen nach
Code:
Printer.Title := sTitle;
?

Kralle 18. Feb 2015 15:41

AW: Lazarus: StringGrid drucken
 
So, jetzt habe ich den anderen Code eingebunden und bei dem kennt Lazarus
Delphi-Quellcode:
GetDeviceCaps
nicht.

Delphi-Quellcode:
 //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;
Gruß Heiko

DeddyH 18. Feb 2015 15:42

AW: Lazarus: StringGrid drucken
 
Die Unit Windows (oder wie die auch sonst heißen mag) ist eingebunden?

Kralle 18. Feb 2015 15:44

AW: Lazarus: StringGrid drucken
 
Moin,

Zitat:

Zitat von DeddyH (Beitrag 1290401)
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.

Ja.
und springt in Printers an diese Stelle:
Delphi-Quellcode:
//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;
Heiko

BadenPower 18. Feb 2015 15:45

AW: Lazarus: StringGrid drucken
 
Zitat:

Zitat von Kralle (Beitrag 1290403)
So, jetzt habe ich den anderen Code eingebunden und bei dem kennt Lazarus
Delphi-Quellcode:
GetDeviceCaps
nicht.

Du musst die "Windows" in die Uses-klausel aufnehmen.

DeddyH 18. Feb 2015 15:47

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.

Kralle 18. Feb 2015 15:48

AW: Lazarus: StringGrid drucken
 
Moin,

Zitat:

Zitat von DeddyH (Beitrag 1290404)
Die Unit Windows (oder wie die auch sonst heißen mag) ist eingebunden?

Ähh, Nein. Wenn ich die einbinde, dann knallt es in der Suchroutine. :evil:

Gruß Heiko

DeddyH 18. Feb 2015 15:49

AW: Lazarus: StringGrid drucken
 
Was denn für eine Suchroutine? Ich kann Dir nicht folgen.

Kralle 18. Feb 2015 15:51

AW: Lazarus: StringGrid drucken
 
Moin,

Zitat:

Zitat von BadenPower (Beitrag 1290406)
Du musst die "Windows" in die Uses-klausel aufnehmen.

Dann meint Lazarus
Zitat:

unit1.pas(183,24) Error: Incompatible type for arg no. 1: Got "TSearchRec", expected "LongWord"
Und zwar hier :
Delphi-Quellcode:
  FindClose (FindRecord);

DeddyH 18. Feb 2015 15:52

AW: Lazarus: StringGrid drucken
 
Ah, sag das doch gleich. Qualifizier das mal mit
Delphi-Quellcode:
SysUtils.FindClose(FindRecord);
[edit] Oder Windows vor SysUtils einbinden, sollte auch funktionieren. [/edit]

Kralle 18. Feb 2015 15:53

AW: Lazarus: StringGrid drucken
 
Moin,

Zitat:

Zitat von DeddyH (Beitrag 1290410)
Was denn für eine Suchroutine? Ich kann Dir nicht folgen.

Delphi-Quellcode:
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;
Gruß Heiko

DeddyH 18. Feb 2015 15:55

AW: Lazarus: StringGrid drucken
 
Siehe meine letzte Antwort, da haben sich die Posts überschnitten.

Kralle 18. Feb 2015 15:57

AW: Lazarus: StringGrid drucken
 
Moin,
Zitat:

Zitat von DeddyH (Beitrag 1290413)
Ah, sag das doch gleich. Qualifizier das mal mit
Delphi-Quellcode:
SysUtils.FindClose(FindRecord);
[edit] Oder Windows vor SysUtils einbinden, sollte auch funktionieren. [/edit]

Habe ich gemacht. Jetzt hängt es wieder beim Drucken:
Delphi-Quellcode:
   TR := Rect(X1,
Zitat:

unit1.pas(252,18) Fatal: Syntax error, ")" expected but "," found

DeddyH 18. Feb 2015 15:59

AW: Lazarus: StringGrid drucken
 
Die Rect-Funktion steht IIRC in Types.pas, also wieder voll qualifizieren: Types.Rect.

Kralle 18. Feb 2015 16:02

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"

BadenPower 18. Feb 2015 16:04

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.

Kralle 18. Feb 2015 16:16

AW: Lazarus: StringGrid drucken
 
Zitat:

Zitat von BadenPower (Beitrag 1290419)
Was steht in unit1.pas in der Zeile 252 ?

Delphi-Quellcode:
 Y2 := 450;
Zitat:

Zitat von BadenPower (Beitrag 1290419)
Die Druckfunktion von swiss funktioniert einwandfrei. Habe ich hier gerade mit Lazarus getestet.

In welchem Kontext? Mal eben Ein Grid platziert und das ausgedruckt?

Gruß heiko

BadenPower 18. Feb 2015 16:19

AW: Lazarus: StringGrid drucken
 
Zitat:

Zitat von Kralle (Beitrag 1290422)
In welchem Kontext? Mal eben Ein Grid platziert und das ausgedruckt?

Yupp.


Schmeiss bitte einmal Deine gesamte Unit hoch.

Kralle 18. Feb 2015 16:25

AW: Lazarus: StringGrid drucken
 
Zitat:

Zitat von BadenPower (Beitrag 1290423)
Schmeiss bitte einmal Deine gesamte Unit hoch.

Also, ich bin jetzt mal Deinen Weg hiermit gegangen:

Delphi-Quellcode:
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.
Und es gibt wieder ein "SIGSEGV" :twisted:

Kralle 18. Feb 2015 16:27

AW: Lazarus: StringGrid drucken
 
Ich glaube mein Lazarus hat einen Schuß

BadenPower 18. Feb 2015 16:39

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.

Kralle 18. Feb 2015 16:44

AW: Lazarus: StringGrid drucken
 
Zitat:

Zitat von BadenPower (Beitrag 1290426)
So, habe jetzt nur Deinen Source in meine Unit kopiert und es funktioniert.

Die aus #25??
Zitat:

Zitat von BadenPower (Beitrag 1290426)
Allerdings musst Du vorher noch die Unit Types in die Uses-Klausel aufnehmen.

Steht da doch drin. Zwischen Grid und Windows.

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

creed steiger 18. Feb 2015 16:44

AW: Lazarus: StringGrid drucken
 
kcontrols wäre auch eine Möglichkeit
http://www.tkweb.eu/en/delphicomp/

und wenn ich mich richtig entsinne hatte Lazreport auch ein Printgrid oder so ähnlich

BadenPower 18. Feb 2015 16:49

AW: Lazarus: StringGrid drucken
 
Zitat:

Zitat von Kralle (Beitrag 1290428)
Zitat:

Zitat von BadenPower (Beitrag 1290426)
So, habe jetzt nur Deinen Source in meine Unit kopiert und es funktioniert.

Die aus #25??

Ja, die aus #25.


Zitat:

Zitat von Kralle (Beitrag 1290428)
Zitat:

Zitat von BadenPower (Beitrag 1290426)
Allerdings musst Du vorher noch die Unit Types in die Uses-Klausel aufnehmen.

Steht da doch drin. Zwischen Grid und Windows.

Habs gerade auch gesehen.
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:

Zitat von Kralle (Beitrag 1290428)
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?

Du willst doch nicht ernsthaft die ganzen Deklarationen und Funktionen in Deinen Quelltext kopieren?

Kralle 18. Feb 2015 16:56

AW: Lazarus: StringGrid drucken
 
[QUOTE=BadenPower;1290431]
Zitat:

Zitat von Kralle (Beitrag 1290428)
Du willst doch nicht ernsthaft die ganzen Deklarationen und Funktionen in Deinen Quelltext kopieren?

War ja nur ein Gedanke.

Ich habe Lazarus jetzt komplett platt gemacht und neu installiert - Ergebis: keine Änderung. :cry:

Gruß Heiko

Kralle 18. Feb 2015 17:03

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?

BadenPower 18. Feb 2015 17:12

AW: Lazarus: StringGrid drucken
 
Zitat:

Zitat von Kralle (Beitrag 1290436)
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?

Kann ich Dir leider nicht sagen, wie es unter Win8 aussieht.

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.

Kralle 18. Feb 2015 17:23

AW: Lazarus: StringGrid drucken
 
Zitat:

Zitat von BadenPower (Beitrag 1290441)
Was passiert genau, wenn Du den Code in #25 ausführst?

Wie lautet die EXAKTE und KOMPLETTE Fehrlermeldung?

Code:
Projekt project1 hat Exception-Klasse >>External: SIGSEGV<< ausgelöst. Bei Adresse 403B70
Im Assembler wird :
Code:
00403B70 833800                   cmpl  $0x0,(%eax)
00403B73 7501                     jne   0x403b76 <fpc_ansistr_decr_ref+6>
Angezeigt.

Zitat:

Zitat von BadenPower (Beitrag 1290441)
Wie ist das Stringgrid eingestellt?
Vor allem die Einstellungen RowCount, ColCount, FixedRows und FixedCols.

Delphi-Quellcode:
  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
Gruß Heiko

BadenPower 18. Feb 2015 17:32

AW: Lazarus: StringGrid drucken
 
Zitat:

Zitat von Kralle (Beitrag 1290442)
Zitat:

Zitat von BadenPower (Beitrag 1290441)
Was passiert genau, wenn Du den Code in #25 ausführst?

Wie lautet die EXAKTE und KOMPLETTE Fehrlermeldung?

Code:
Projekt project1 hat Exception-Klasse >>External: SIGSEGV<< ausgelöst. Bei Adresse 403B70
Im Assembler wird :
Code:
00403B70 833800                   cmpl  $0x0,(%eax)
00403B73 7501                     jne   0x403b76 <fpc_ansistr_decr_ref+6>
Angezeigt.

Das passiert beim Start der Anwendung, also ohne irgendetwas zu machen?

Wenn ja, dann bin ich vorläufig raus und der Fehler müsste bei "Lazarus gegen Windows 8.1" zu suchen sein.

Kralle 18. Feb 2015 18:03

AW: Lazarus: StringGrid drucken
 
Zitat:

Zitat von BadenPower (Beitrag 1290445)

Das passiert beim Start der Anwendung, also ohne irgendetwas zu machen?

Nein, wenn ich auf den Button klicke der den Ausdruck starten soll.
Ich kann die Anwendung starten und Daten ins Grid eintragen, aber wehe ich starte den Ausdruck.

BadenPower 18. Feb 2015 18:24

AW: Lazarus: StringGrid drucken
 
Zitat:

Zitat von Kralle (Beitrag 1290450)
Zitat:

Zitat von BadenPower (Beitrag 1290445)

Das passiert beim Start der Anwendung, also ohne irgendetwas zu machen?

Nein, wenn ich auf den Button klicke der den Ausdruck starten soll.

Ich kann die Anwendung starten und Daten ins Grid eintragen, aber wehe ich starte den Ausdruck.

Dann zeig doch einmal den kompletten Code, WELCHER NICHT FUNKTIONIERT.

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???

Kralle 18. Feb 2015 18:46

AW: Lazarus: StringGrid drucken
 
Moin,


Zitat:

Zitat von BadenPower (Beitrag 1290452)
Dann zeig doch einmal den kompletten Code, WELCHER NICHT FUNKTIONIERT.

Um das Problem in den Griff zu bekommen habe ich nur die Druckroutine, ein StringGrid und einen Button in ein neues Projekt gepackt.
Der Code steht in Beitrag 25:

http://www.delphipraxis.net/1290424-post25.html

Zitat:

Zitat von BadenPower (Beitrag 1290452)
Also das GANZE Projekt.

Der Code in Beitrag 25 läuft nicht und wir brauchen hier nicht über ein ganzes Projekt reden, wenn der Code schon nicht läuft.
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:

Zitat von BadenPower (Beitrag 1290452)
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.

An dem Code, den wir gestern in einem anderen Thread bereinigt haben, habe ich nichts mehr geändert.
Ich hhabe nur die Druckprocedure ins Projekt kopiert und den Aufruf in Main-Menü eingebunden.

Zitat:

Zitat von BadenPower (Beitrag 1290452)
Die Vermutung bekomme ich, da in den geposteten Schleifen wieder bei 1 angefangen wird ohne Rücksicht auf FixedCols und FixedRows.

Welche Schleife in welchem Code meinst Du jetzt?
Zitat:

Zitat von BadenPower (Beitrag 1290452)

Wie soll man denn einen Fehler lokalisieren, wenn die entsprechenden Daten verheimlicht werden???

Siehe oben und Beitrag 25.

Gruß HEiko

BadenPower 18. Feb 2015 19:03

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;

Kralle 18. Feb 2015 19:12

AW: Lazarus: StringGrid drucken
 
N'abend,

Zitat:

Zitat von BadenPower (Beitrag 1290461)
Jetzt noch einmal ganz von vorne:

Wenn Du den Code in #25 ausführst, dann läuft das Programm.

Nein.
Zitat:

Zitat von BadenPower (Beitrag 1290461)
Das StringGrid1 ist komplett leer und
RowCount ist 5
ColCount ist 5
FixedRows ist 1
FixedCols ist 1

Ja.
Zitat:

Zitat von BadenPower (Beitrag 1290461)
wenn Du nun Button1 drückst, dann kommt der Fehler?

Ja.

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 02:54 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz