Forsøgt med forskellige koder, at udskriv Image1.Picture.Graphic.
Prøver med IndputBox, at tildele printeren en skalerings værdi, også hvis der ikke er fortaget nogen input. Og med 185 som Default værdi, hvis der ikke er fortaget nogen input.
Hvis talet 185 indsætte i stedet for variablen "skalering" så virker det. Vil du hjælpe mig med at løse problemmet?
Input forsøg 1.
procedure TfrmProfil.btnSkaleringClick(Sender: TObject); begin skalering:= IndtastKommaTal('Tilpasning for udskrivning på printer',185); try begin skalering:= 185; edtSkalering.Text:= FloatToStr(skalering); //Showmessage(FloatToStr(skalering)); end; except end; end;
Input forsøg 2.
procedure TfrmProfil.btnSkaleringClick(Sender: TObject); begin skalering:=StrToIntDef(inputbox('Indskriv antal sektioner','Heltal','10'),-1); if skalering <= 1 then skalering:= 185; end;
Fejlen opstår her når der forsøges udprintning.
procedure TfrmProfil.btnPrintClick(Sender: TObject); var R: TRect; begin Printer.Orientation := poLandscape; if PrinterSetupDialog1.Execute then begin Printer.BeginDoc; // ** fmProfilValg.StandartTekstNaca4415; with Printer do try tilpasX:=Profilbredde[18]/skalering;***Her opsstår fejmeddelsen "EDivByZero" tilpasY:=Profilbredde[18]/skalering;***Her opsstår fejmeddelsen "EDivByZero"
Hvis du kan få din tegning på skærmen målefast, så tror jeg at ScaleY og ScaleX er et forhold mellem GetDeviceCaps på din forms canvas og den som printeren har. Sådan som du har lavet det ovenfor.
Det er svært at gætte hvad der sker. Har du brugt debuggeren. Her tænker jeg på funktionstasterne F5, F7 og F8 til at steppe dig igennem programmet. Med ctrl-f5 kan du kontrollere variable, såsom "skalering". Stil cursoren på variablen, tryk ctrl-f5. Tryk derefter på F5 for at sætte et break-point. Når programmet kommer forbi koden, så kan du steppe frem med F7 og F8.
Hvis Skalering er en privat variabel, gemt i TfrmProfil, så bør den hedde fSkalering. Hvis det derimod er en global variabel, så skal du skamme dig, flytte variablen til TfrmProfil og omdøbe den!
Det vil være en god idé at skubbe linien "if skalering <= 1 then skalering:= 185;" ned på to linier:
if skalering <= 1 then // Lav break-point her. skalering:= 185;
Når du stepper kan du se om programmet tildeler "skalering" en værdi.
Har fået funktionen til, at virke, måske ikke så smart?
Resultatet: procedure TfrmProfil.btnSkaleringClick(Sender: TObject); begin fSkalering:=StrToIntDef(inputbox('Indskriv antal sektioner','Heltal','185'),-1); if fSkalering <= 1 then fSkalering:=185; edtSkalering.Text:= IntToStr(Round(fSkalering)); end;
Øver mig på Debuggeren funktionen, for at lærer dette.
Men når jeg debuggeren og gør som du beskriver, ender jeg i min "MinUnits.pas" og kan step op og ned, men kan ikke komme ud af functionen igen?
function UpperText(Text : string) : string; var I : Integer; B : Boolean; begin Result := Text; B := True; for I := 1 to Length(Result) do begin if B then begin Result[I] := AnsiUpperCase(Result[I])[1]; B := False; end else Result[I] := AnsiLowerCase(Result[I])[1]; if Result[I] = ' ' then B := True; end; end;
procedure TfrmProfil.btnSkaleringClick(Sender: TObject); begin fSkalering := StrToIntDef(inputbox('Indskriv antal sektioner','Heltal','185'),-1); if fSkalering <= 1 then fSkalering :=185; edtSkalering.Text := IntToStr(Round(fSkalering)); end;
Men når jeg debuggeren og gør som du beskriver, ender jeg i min "MinUnits.pas" og kan step op og ned, men kan ikke komme ud af functionen igen?
- mon ikke det er fordi funktionerne i "MinUnits.pas" kaldes flere gange? Hvis du vil videre i programmet, så kan du fjerne break-pointet ved at stille dig på linien og trykke på f5 og derefter på f9.
Mht din UpperText så har jeg denne version:
// hurtigere med "const" foran parametre der ikke ændres function UpperText(const aText : string) : string; var I : Integer; begin // Ligeså godt konvertere det hele til små nu Result := trim(AnsiLowerCase(aText)); for I := 1 to Length(Result) do // Håndterer også "bruun-rasmussen" => "Bruun-Rasmussen" if (i = 1) or ((i > 1) and (aText[i-1] in [' ','-'])) then Result[I] := AnsiUpperCase(Result[I])[1]; end;
Savner en AnsiUpCase der kun konverterer eet tegn, men AnsiUpperCase()[1] er sikkert næsten lige så hurtig.
Kan du ikke bruge en TSpinEdit (findes under "samples") i stedet for InputBox'en? Sæt Min = 1, max = 185 og lav den evt. readonly. Det kræver selvfølgelig at du placerer komponenten (TSpinEdit) på en form et eller andet sted - og sådan en har du måske ikke.
Det er jo ikke sikker at max = 185, det kunne jo værer, at en anden printer for at værer målfast, skal værer max =200.
Men hvad ang. nedstående procedure/fSkalering hvad er lige det tal 185, for en størrelse?
procedure TfrmProfil.btnSkaleringClick(Sender: TObject); begin fSkalering := StrToIntDef(inputbox('Indskriv antal sektioner','Heltal','185'),-1); if fSkalering <= 1 then fSkalering :=185; edtSkalering.Text := IntToStr(Round(fSkalering)); end;
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.