Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DisplayWidth (TField) in Milimeter umrechnen (https://www.delphipraxis.net/30933-displaywidth-tfield-milimeter-umrechnen.html)

Icemanemp 1. Okt 2004 12:41


DisplayWidth (TField) in Milimeter umrechnen
 
Hi,

ich brauch für meine Abschlussprojekt (Fachinformatiker Anwendungsentwicklung) ne mathematische Formel, wie ich die DisplayWidth eines TFields in Milimeter oder cm umrechnen kann!
Da DisplayWidth nur die Anzahl der Zeichen angibt kann ich diese nich an mein Projekt übergeben! Ich hab mir den Quellcode des DBGrids angeschaut, aber nur diese Formel gefunden:
Delphi-Quellcode:
 Field.DisplayWidth := (Value + (TM.tmAveCharWidth div 2) - TM.tmOverhang - 3)
          div TM.tmAveCharWidth;
Wenns interessiert es ist was mit List&Label und diese Software verarbeitet nunmal alles in Milimeter!
Wäre net, wenn mir einer helfen könnte, da mir nur noch diese kleine Berechnung zur Vollendung meines Abschlussprojektes fehlt! Danke

ibp 1. Okt 2004 13:02

Re: DisplayWidth (TField) in Milimeter umrechnen
 
vielleicht lässt sich da ja was mit canvas und den pixeln machen!

Icemanemp 1. Okt 2004 13:11

Re: DisplayWidth (TField) in Milimeter umrechnen
 
Die Formel aus den DBGrid scheint mir schon richtig zu sein, aber wie und mit was soll ich die Werte füllen bzw. muss ich dann noch irgendwas berechnen, da ich denke, da man dann nur ein ergebnis hat, das pixelgenau ist, weil Windows ja Pixel zeichnet. Ich brauch aber Millimeter...

ibp 1. Okt 2004 13:18

Re: DisplayWidth (TField) in Milimeter umrechnen
 
das kommt doch dann auf die auflösung des displays an, ist die nicht in pixel/inch angegeben, das kann man dann doch auf mm umrechnen!

Icemanemp 1. Okt 2004 13:29

Re: DisplayWidth (TField) in Milimeter umrechnen
 
Screen.PixelsperInch gibt aber nur den vertikalen Wert an! horizantal scheint der anders zu sein lt. Hilfe! Da ich aber Spalten einer tabelle habe sind diese horizontal angeordnet!
Bin z.Z am rumbasteln an der Formel, aber bekomm da nix gescheites raus!

Jörn 1. Okt 2004 13:40

Re: DisplayWidth (TField) in Milimeter umrechnen
 
Das wird auch nichts. Es kommt ganz auf die Größe des Monitors an, auf die Einstellungen (nutze ich den ganzen Bildschirm, oder hab ich schwarze Ränder?) usw. Wenn das was werden soll, dann nur über das Ausmessen des Bildschirms durch den User.

Icemanemp 1. Okt 2004 13:48

Re: DisplayWidth (TField) in Milimeter umrechnen
 
Unmöglich ist das bestimmt nicht! Egal ob ich schwarze Ränder hab oder nicht die Auflösung kann ja abgefragt werden! vielleicht auch noch obs small also 96dpi schriftgrösse benutzt wird usw., aber die genau berechnung fehlt mir!

ibp 1. Okt 2004 13:50

Re: DisplayWidth (TField) in Milimeter umrechnen
 
ok, ^ das stimmt also sollte man dvon ausgegeh, daß der bildschirm voll ausgenutzt wird und es ein tft ist, da hier die sichtbaren Bildschirmgröße in zoll (1 zoll (1") = 2,54 cm = 1 inch) angegeben ist! also ist die umrechnung nun nicht allzu schwer, nur muss das programm wissen, wie hoch ist die auflösung und wie groß ist der sichtbare bereich, zur not leg ein maßband mit dabei! :lol:

dizzy 1. Okt 2004 13:54

Re: DisplayWidth (TField) in Milimeter umrechnen
 
Es ist ohne Hilfe des Users unmöglich! Woher willst du denn wissen, ob ich nen 14"er auf 800x600, oder nen 22"er auf 800x600 Pixel fahre? Das bekommst du softwareseitig nicht raus. Und selbst wenn: Wer sagt dir, dass ich bei meinem 22"er den Sichtbereich nicht so klein gemacht habe, dass effektiv nur so 17" angezeigt werden?
Die größe eines Pixels ist nicht softwareseitig ermittelbar! Geht einfach nicht. Du brauchst den User, und selbiger ein Lineal und ein gutes Auge. Mit dessen Hilfe kannst du dann deine Ausgaben kalibrieren - anders nicht.

Aenogym 1. Okt 2004 13:58

Re: DisplayWidth (TField) in Milimeter umrechnen
 
hi,

die auflösung und PixelsPerInch nützen dir garnichts, wenn du nicht die exakten ausmaße des im monitor angezeigten bildes weißt ;)

denn angenommen du findest jetzt zufällig ein paar werte, die das ganze bei dir richtig ausgeben. dann stell in deinem monitor einfach mal dein bild ein (zB etwas breiter oder dünner).
wenn du nun mit diesem "verzerrten" bild etwas am pc zeichnest o.ä. und dies dann mit dem gleichen code drucken lässt, dann wird das verschoben sein, da du ja nicht mehr die pixel so siehst, wie vorher.

worauf ich hinaus will: pixel sind virtuelle größenangaben. millimeter reelle.
du kannst pixel in millimeter nur umrechnen, wenn du folgende größen kennst:
-exakte ausmaße des angezeigten bildes
-die auflösung
-die DPI

dann kannst du dir das ausrechnen :)

Aenogym

edit: war ich doch wieder zu lahm :mrgreen:

Icemanemp 1. Okt 2004 14:04

Re: DisplayWidth (TField) in Milimeter umrechnen
 
Mir geht es doch gar nicht darum,das ich genau die gleich grösse haben will! ich hab nur die DisplayWidth und wenn ich das an List&Label übergebe, dann sind es Millimeter... ich könnte doch eigentlich von der durschnittlichen Breite eines Zeichen (in List&Label ist es Arial 10) die ich mit TTextMetric -> Objekt.tmAveCharWidth x DisplayWidth errechnen wie gross, die Spalte in List&Label sein soll.

Die Displayresolution kann ich doch einfach abfragen oder? und die pixel per inch bekomm ich doch auch raus, als kann man doch auhc alles in millimeter umrechen egal ob 22" oder 14" monitor! Mit geht es nciht darum, das ich es original getreu millimeter nachbilden möchte, sondern, das wenn ich Spalten auf meinem Grid vergrössere, das diese im richtigen verhältnis zunehmen, sodass L&L richtig druckt!

Wenn net ist auch net so schlimm, dann nehm ich ein Faktor mit dem ich arbeite um umzurechnen oder lass es so! Die Hauptfunktionalität besteht ja schon! und da das Projekt von der IHK genehmigt wurd und ich später ne Präsenatation darüberhalten muss, wird das nicht stören! Trotzdem danke

Aenogym 1. Okt 2004 14:09

Re: DisplayWidth (TField) in Milimeter umrechnen
 
hi nochmal,

du musst aber die ausmaße des angezeigten bildes auf dem monitor wissen, da du sonst kein verhältnis hast. denn dein text könnte auf dem monitor beliebig vergrößert oder verkleinert werden, obwohl er unverändert ausgedruckt wird. denn für das auge verändert sich was, aber nciht für den computer.

also kann der benutzer so keine richtige vorstellung vom ergebnis bekommen.

verstehst du? du musst die ausmaße des bildes kennen, dass auf dem monitor angezeigt wird. und das geht nur mit lineal ;) und je nachdem, wie genau diese ausmaße abgelesen und dem programm mitgeteilt werden, wird der ausdruck auch stimmen.

Aenogym

Icemanemp 1. Okt 2004 14:19

Re: DisplayWidth (TField) in Milimeter umrechnen
 
Stimmt... Also geht es net... dann lass ich das kleine Feature weg...

ibp 1. Okt 2004 14:29

Re: DisplayWidth (TField) in Milimeter umrechnen
 
wieso? du kannst doch eine kallibrierung einbauen, in der der user ein bestimmtes rechteck abmisst und die daten eingibt.

Aenogym 1. Okt 2004 14:31

Re: DisplayWidth (TField) in Milimeter umrechnen
 
Zitat:

Zitat von Icemanemp
Stimmt... Also geht es net... dann lass ich das kleine Feature weg...

wie ibp schon sagte, es geht. der user muss nur sein bild oder einen teil davon messen und im programm angeben. dann kannst du es auch ausrechnen.

Aenogym

Luckie 1. Okt 2004 17:33

Re: DisplayWidth (TField) in Milimeter umrechnen
 
Setzt den MapMode auf MM_LOMETRIC dann liefert dir die Funktion GetTextMetrics die Werte in 1/10 Millimeter. Es ist sowieso zu empfeheln auf den Drucker Canvas nur in besagten MapMode zu arbeiten. Rechnest du in Pixel, sieht das ganze auf einem Ghostscript Drucker wieder ganz anderes aus.

Icemanemp 3. Okt 2004 10:58

Re: DisplayWidth (TField) in Milimeter umrechnen
 
Sorry, aber das mit dem Quadrat wird nicht realisierbar sein, da das Projekt einer Erweiterung in unserem Warenwirtscahftssystem ist. Dem Kunden kann ich so was nicht zumuten! Bei einer so grossen Software sieht das bischen komisch aus, wenn man z.B. in den Basisdaten ein Kalibrierungsbereich hat ;)

@Luckie
Geht das auch auf dem Desktop? Als, wenn ich mir von TFont, das Handle nehme und dann TTextMetric zurückbekomme? Ich kann nämlich nicht auf den Druckerzeichenfläche zugreifen, da wir List&Label von Combit als Reportsoftware einsetzen!
Für mein Projekt wird es ein bischen "vergewaltigt", da List&Label mehr dafür gedacht ist mit vorhanden Daten Listen zu designen! Mein Projekt ist aber dynamisch...

Ich hoffe ihr versteht was mein Projekt ist, damit ihr mir auch helfen könnt... wenn weiter Aufklärungsbedarf besteht erklär ich es nochmal ausführlich!

Icemanemp 4. Okt 2004 14:07

Re: DisplayWidth (TField) in Milimeter umrechnen
 
Nur so zur Info!!! Es geht doch!
Delphi-Quellcode:
function TLLGenerischerDruck.GetDisplayWidthInMillimeter(FieldNo:Integer):Integer;
var OldMapMode:Integer;
    TM: TEXTMETRIC;
begin
  Result := FGrid.Fields[FieldNo].DisplayWidth; //Kein Millimeterangabe! Sondern Anzahl der Zeichen
  OldMapMode := GetMapMode(FGrid.Canvas.Handle);
  if SetMapMode(FGrid.Canvas.Handle, MM_LOMETRIC) <> 0 then
  begin
    if GetTextMetrics(FGrid.Canvas.Handle, TM) then
    begin
      result := Ceil(TM.tmAveCharWidth / 10 * FGrid.Fields[FieldNo].DisplayWidth); //Berechnung für Millimeter;
    end;
  end;
  SetMapMode(FGrid.Canvas.Handle, OldMapMode);
end;
Durch die Änderunge des MapMode erhalte ich Millimeterangaben und durch die Ermittlung der durchschnittlichen Zeichen weite kann ich die tatsächliche Weite in Millimeter für List&Label bestimmen! Ihr habt mich schon voll krank gemacht! ich dachte schon mein Projekt wäre nicht so wie ich es will,aber hab es doch hinbekommen! Wenn man nun noch die gleiche Schriftart und Grösse im Grid, wie auch in List&Label benutzt, dann geht das... Habs mit den verschiedensten Grids ausprobiert und es funzt...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:42 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-2025 by Thomas Breitkreuz