Avatar billede monie Nybegynder
24. april 2004 - 14:04 Der er 5 kommentarer

Via IndputBox, at tildele variablen en værdi.

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"

      ScaleX := GetDeviceCaps(Handle, logPixelsX) / PixelsPerInch; //division der giver decimaler
      ScaleY := GetDeviceCaps(Handle, logPixelsY) / PixelsPerInch;
      R := Rect(0, 0, trunc(Image1.Picture.Width * ScaleX * tilpasX),
      trunc(Image1.Picture.Height * ScaleY * tilpasY));
      Canvas.StretchDraw(R, Image1.Picture.Graphic);  // **
    finally
    EndDoc;  // **
  end;
end;
btntegn.Click;
end;
Avatar billede hrc Mester
26. april 2004 - 22:54 #1
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.
Avatar billede monie Nybegynder
27. april 2004 - 07:10 #2
Hej hrc

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;

Mvh
Avatar billede hrc Mester
29. april 2004 - 00:08 #3
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.
Avatar billede hrc Mester
29. april 2004 - 00:10 #4
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.
Avatar billede monie Nybegynder
29. april 2004 - 17:57 #5
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;
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester