AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrere Formulare an Stringgridgröße anpassen

Ein Thema von Delphi-Laie · begonnen am 28. Okt 2010 · letzter Beitrag vom 2. Nov 2010
Antwort Antwort
Seite 4 von 4   « Erste     234   
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#31

AW: Mehrere Formulare an Stringgridgröße anpassen

  Alt 31. Okt 2010, 14:45
Eine Procedure, Funktion oder Methode sollte genau eine Aufgabe durchführen.
Ist das nicht Ansichtssache?

Letztlich ist auch eine Unit ein Modul, und zwar eines, das meistens Code für ziemlich viel Aufgaben enthält und i.d.R. auch durchführt.

Falls mehr als eine Aufgabe durchgeführt wird, müssen die Teilaufgaben als Unterfunktionen implementiert werden.
Vermutlich meinst Du, wenn an verschiedenen Codestellen der (prinzipiell) gleiche Code im Quelltext vorhanden ist bzw. beim Programmablauf ausgeführt wird, dann sollten Unterprogramme eingesetzt werden.

ColWidths[x] := biggestwidth + 6; Der Grund für das +6 würde mich mal interessieren.
Ist das die Breite einer Scrollbar ?
Ich kann nur für mich antworten. Ich fummelte mir einen ähnlichen Wert zurecht, damit das Stringgrid nicht gar zu gequetscht wird: So ist wenigstens noch ein ganz klein wenig Platz zwischen Schrift und Spaltentrennern.

Der Code funktioniert übrigens wohl auch nicht im FormCreate,
sondern erst im FormActivate (Canvas ist noch nicht richtig initialisiert)
Jein. Bei Delphi 2 und 3 funktioniert er auch schon im FormCreate (ich deutete das weiter vorn an), ab Delphi 4 leider nicht (da habe ich umständlich zwei Codeblöcke, je nachdem, ob Anfang oder später). Aber nunmehr bin ich dank Deiner auf eine Fährte gestoßen, die den Code, was die Delphi-Versionen anbetrifft, evtl. universeller gestalten läßt.

Geändert von Delphi-Laie (31. Okt 2010 um 22:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#32

AW: Mehrere Formulare an Stringgridgröße anpassen

  Alt 31. Okt 2010, 17:51
Eine Procedure, Funktion oder Methode sollte genau eine Aufgabe durchführen.
Ist das nicht Ansichtssache?
Eher eine professionelle Einstellung zum Programmieren.
In dem Buch "Clean Code: A Handbook of Agile Software Craftsmanship" von Robert C. Martin wird das ausführlich beschrieben.
Kurzzusammenfassung
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#33

AW: Mehrere Formulare an Stringgridgröße anpassen

  Alt 31. Okt 2010, 18:01
@sx2008
wenn ich die Kurzzusammenfassung lese, kann ich mich den wenigsten Punkten uneingeschränkt anschließen.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#34

AW: Mehrere Formulare an Stringgridgröße anpassen

  Alt 31. Okt 2010, 22:56
@sx2008
wenn ich die Kurzzusammenfassung lese, kann ich mich den wenigsten Punkten uneingeschränkt anschließen.
Du brauchst dich ja nicht dogmatisch an das Buch halten (steht sogar im Buch, nur beim "Durcharbeiten" der darin enthaltenen Übungen soll man sich darauf einlassen).
Und die Kurzzusammenfassung kann die Überzeugungsarbeit des Buches nicht bei weitem leisten, dazu ist sie einfach zu knapp
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#35

AW: Mehrere Formulare an Stringgridgröße anpassen

  Alt 31. Okt 2010, 22:59
Eine Procedure, Funktion oder Methode sollte genau eine Aufgabe durchführen.
Ist das nicht Ansichtssache?
Eher eine professionelle Einstellung zum Programmieren.
Eine Einstellung (und nichts anderes ist es) zum professionellen Programmieren wäre ein klein wenig dezenter gewesen. Eine Einstellung (!) jedoch als "professionell" hinzustellen, halte ich - mit Verlaub - schon ein wenig für überheblich.

Letztlich ist es doch auch (und gerade?) im Bereich der Programmierung, der Informatik, wie übrigens in jeder Wissenschaft, in jedem Fachgebiete, so, daß alle möglichen, teilweise sogar konträre Meinungen aufeinanderprallen - manchmal sogar mehr, als es Diskutanten gibt.

Natürlich kann man Programmaufgaben so weit "herunterbrechen" (schönes Modewort), daß zum Schluß fast nur noch die einzelne Anweisung übrigbleibt. Hinsichtlich der Fehleranfälligkeit, Übersichtlichkeit und Wartbarkeit des Quelltextes, der Größe und Ablaufgeschwindigkeit des Compilates u.ä. Größen mag das aber nicht gerade Optimum sein - und schon gar nicht pauschal.

Geändert von Delphi-Laie ( 1. Nov 2010 um 10:34 Uhr)
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#36

AW: Mehrere Formulare an Stringgridgröße anpassen

  Alt 31. Okt 2010, 23:21
Hallo,

was macht ihr da, und warum.....?

Warum nicht einfach so:
Delphi-Quellcode:
function GetGridWidth(aStringGrid: TStringGrid): integer;
var
  i: integer;
begin
  Result := 0;
  with aStringGrid do
    for i := 0 to ColCount-1 do
      inc(Result, ColWidths[i] + GridLineWidth);
end; // GetGridWidth

function GetGridHeight(aStringGrid: TStringGrid): integer;
var
  i: integer;
begin
  Result := 0;
  with aStringGrid do
    for i := 0 to RowCount-1 do
      inc(Result, RowHeights[i] + GridLineWidth);
end; // GetGridHeight

procedure AdjustFormSize(aStringGrid: TStringGrid; aForm: TForm);
begin
  with aStringGrid do
    begin
      ClientWidth := GetGridWidth(aStringGrid);
      ClientHeight := GetGridHeight(aStringGrid);
    end;
  aForm.AutoSize := true;
end; // AdjustFormSize
und dann im FormShow oder wo es passieren soll
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  AdjustFormSize(StringGrid1, Self);
end;
Ganz einfache Antwort: Weil dieser Code nicht so funktioniert, wie ich es wünsche und auch beschrieb. Nicht nur, daß die Scrollbalken zu sehen sind (sofern erlaubt), das StringGrid wird nicht vollständig dargestellt (auch dann nicht, wenn der Bildschirm dafür eigentlich groß genug ist), und das Formular ist "dank" AutoSize nicht einmal mehr manuell zoombar.

Sooo simpel ist es also wohl nicht, womit auch die Frage nach dem Warum beantwortet ist.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#37

AW: Mehrere Formulare an Stringgridgröße anpassen

  Alt 31. Okt 2010, 23:32
Sicher kann man es auch übertreiben oder gar missverstehen und ins Gegenteil verkehren.

Aber vielfach ist Programmieren ein Kampf gegen Komplexität.
Man hackt sie in Teile, packt sie in Boxen und wendet abstrakte (und damit einfachere) Konzepte auf sie an, um Probleme zu lösen, die man im Ganzen nicht fassen kann.
Dabei sollte man sich (ohne vernünftigen Grund) nicht selbst in den Rücken fallen.


Warum sind zum Beispiel funktionale Programmiersprachen zur Zeit für viele interessant: Seiteneffektfreiheit.
Das Beschränken einer Funktion/Prozedur auf eine Aufgabe könnte man als schwächeres verwandtes Konzept verstehen. Es kann zwar Seiteneffekte geben, aber diese sollten sich nur auf für Entwickler erwartbare Teile des Programms auswirken.

Zitat:
3.) das Formular unsichtbar und wieder sichtbar machen
Zum Beispiel das ist völlig unerwartet für "Form_Skalieren". Wenn du diese Prozedure eventuell später an anderer Stelle aufrufst, wunderst du dich, warum dein Formular "flackert", onShow ausgeführt wird und dein Formular zentriert wird.
Da bist du den Fehler gefunden hast ...
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.

Geändert von BUG (31. Okt 2010 um 23:34 Uhr)
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#38

AW: Mehrere Formulare an Stringgridgröße anpassen

  Alt 1. Nov 2010, 01:48
Ist da eigentlich die Ausgangsfrage richtig gestellt?

Das Formular an ein StringGrid anpassen ist ja eine Kleinigkeit (ClientWith auf StrigGrid.Width oder Form.AutoSize wurde ja schon genannt).

Nur beides ist natürlich wenig hilfreich, bei den tatsächlichen Wünschen des TS, wie schon festgestellt wurde. Bei AutoSize passt sich das Formular an die StringGrid-Breite an, egal wie sinnvoll die aktuelle StringGrid-Breite eingestellt ist. Gleiches natürlich bei manuellem setzen von ClientWidth.

Die Frage lautet also...

Wie ermittele ich die optimale Breite/Höhe eines StringGrid, damit die Spalten und Zeilen optimal (ohne Scrollbalken und ohne Leerräume) angezeigt werden?


Die Frage nach der Client Breite/Höhe des Formulars ist also völlig unnötig, den die ist nach Klärung der tatsächlichen Frage beantwortet.

***

Eine mögliche Funktion müsste also etwa so aussehen, wie blauweiss schon im Ansatz gezeigt hat:
Delphi-Quellcode:
function BestStringGridSize(aStringGrid : TStringGrid): TSize;
var
  i : Integer;
begin
  with aStringGrid do
  begin
    Result.cx := 0;
    for i := 0 to ColCount -1 do
      inc(Result.cx, ColWidths[i]);
    inc(Result.cx, (GridLineWidth * (ColCount -1)));

    Result.cy := 0;
    for i := 0 to RowCount -1 do
      inc(Result.cy, RowHeights[i]);
    inc(Result.cy, (GridLineWidth * (RowCount -1)));
  end;
  // Add default Bevel Border
  inc(Result.cx, 4);
  inc(Result.cy, 4);
end;
Mit Size.cx/cy wird dann einfach ClientWidth/ClientHeight des Formulars gesetzt, für eine momentane Anpassung des Formulars oder Form.AutoSize für eine permanente.

Wenn das StringGrid nicht optimal passt (also ohne Scrollbalken und ohne Leerraum), war die Berechnung zu ungenau und muss optimiert werden. Ich denke also auch, das der Ansatz von blauweiss der richtige ist.

Problem könnten Unterschiedliche Designs von XP/VISTA/Win7 werden... auf ein BevelKind-Stil sollte dann verzichtet werden, um es nicht noch schwerer zu machen.

Geändert von Satty67 ( 1. Nov 2010 um 02:14 Uhr)
  Mit Zitat antworten Zitat
blauweiss

Registriert seit: 19. Jun 2007
142 Beiträge
 
#39

AW: Mehrere Formulare an Stringgridgröße anpassen

  Alt 1. Nov 2010, 19:08
Hallo Delphi-Laie,


Die Skalierung des Stringgrids, konkret der Minimierung seiner Spaltenbreiten, ist nicht mein Problem; meine Codezeilen dazu funktionieren. Deine sind m.E. auch nicht substantiell anders; mir scheint sogar so, als daß meine sogar ein Quentchen effizienter sind, da ich die Spaltenbreiten anfangs nicht einnull(t)e (so sah man Code früher auch aus), sondern gleich mit der Spaltenbreite der ersten Zeile bestücke.
Dein Code dazu:
Delphi-Quellcode:
for l:=0 to pred(StringGrid.ColCount) do StringGrid.ColWidths[l]:=Zellenbreitenzuschlag+StringGrid.Canvas.TextWidth(StringGrid.Cells[l,0]); //Skalieren nach Tabellenkopf
for l:=0 to pred(StringGrid.ColCount) do for m:=1 to pred(StringGrid.RowCount) do
  if StringGrid.ColWidths[l]<Zellenbreitenzuschlag+StringGrid.Canvas.TextWidth(StringGrid.Cells[l,m])
  then StringGrid.ColWidths[l]:=Zellenbreitenzuschlag+StringGrid.Canvas.TextWidth(StringGrid.Cells[l,m]);
Mein Vorschlag:
Delphi-Quellcode:
procedure MinimizeColWidths(aStringGrid: TStringGrid);
var
  x, y: integer;
  onewidth, biggestwidth: integer;
begin
  with aStringGrid do
    for x := 0 to ColCount-1 do
      begin
        biggestwidth := 0;
        for y := 0 to RowCount-1 do
          begin
            onewidth := Canvas.TextWidth(Cells[x, y]);
            if (onewidth > biggestwidth) then
              biggestwidth := onewidth;
          end;
        ColWidths[x] := biggestwidth + 6;
      end;
end; // MinimizeColWidths
Dein Code ist nicht effizienter, sondern 1. unleserlich und 2. weniger performant, da bei Dir x-mal die Spaltenbreite eines StringGrids geändert wird, bei mir nur 1-mal.

Das mit dem Constrain stimmt: Das Fenster ist merkwürdigerweise auf 112 Pixel (das Minimum) voreingestellt, so daß die Dekrementierungsschleife natürlich endlos wird. Merkwürdig, wenn die Codezeilen direkt verwende, funktionieren sie tadellos.... Danke auch für diesen Hinweis!
Ich will Dir nicht zu nahe treten, aber das halte ich für ausgeschlossen.

ColWidths[x] := biggestwidth + 6; Der Grund für das +6 würde mich mal interessieren.
Ist das die Breite einer Scrollbar ?
Dieses +6 hatte ich als Wunsch des OP interpretiert, die Zelleninhalte nicht bündig in die Spalten zu quetschen. Sie tauchen in seinem Code als Konstante auf, die ich mir erspart habe.

Ich würde den Code auch mal mit "large fonts" testen.
Sollte in Canvas.TextWidth berücksichtigt werden.

Der Code funktioniert übrigens wohl auch nicht im FormCreate,
sondern erst im FormActivate (Canvas ist noch nicht richtig initialisiert)
Deshalb hatte ich auch FormShow vorgeschlagen.

Eine Procedure, Funktion oder Methode sollte genau eine Aufgabe durchführen.
Ist das nicht Ansichtssache?
Eher eine professionelle Einstellung zum Programmieren.
Eine Einstellung (und nichts anderes ist es) zum professionellen Programmieren wäre ein klein wenig dezenter gewesen. Eine Einstellung (!) jedoch als "professionell" hinzustellen, halte ich - mit Verlaub - schon ein wenig für überheblich.

Letztlich ist es doch auch (und gerade?) im Bereich der Programmierung, der Informatik, wie übrigens in jeder Wissenschaft, in jedem Fachgebiete, so, daß alle möglichen, teilweise sogar konträre Meinungen aufeinanderprallen - manchmal sogar mehr, als es Diskutanten gibt.

Natürlich kann man Programmaufgaben so weit "herunterbrechen" (schönes Modewort), daß zum Schluß fast nur noch die einzelne Anweisung übrigbleibt. Hinsichtlich der Fehleranfälligkeit, Übersichtlichkeit und Wartbarkeit des Quelltextes, der Größe und Ablaufgeschwindigkeit des Compilates u.ä. Größen mag das aber nicht gerade Optimum sein - und schon gar nicht pauschal.
Deine Reaktion auf Foristen, die Dir helfen wollen, ist ungewöhnlich. Die Herangehensweise an Deine Probleme, Deine Problembeschreibungen sowie die Reaktion auf Vorschläge Anderer scheint mir nicht professionell. Das ist nicht überheblich, denn Du wirst wohl nicht professionell (beruflich) programmieren, oder ?

Ganz einfache Antwort: Weil dieser Code nicht so funktioniert, wie ich es wünsche und auch beschrieb. Nicht nur, daß die Scrollbalken zu sehen sind (sofern erlaubt), das StringGrid wird nicht vollständig dargestellt (auch dann nicht, wenn der Bildschirm dafür eigentlich groß genug ist)
Ich sehe 2 mögliche Knackpunkte:
1. Setzen von ClientWidth und ClientHeight des StringGrid funktioniert nur dann wie gewünscht, wenn StringGrid.ScrollBars = ssNone
2. TForm.AutoSize scheint tatsächlich ein Problem damit zu haben, die Größe des Forms zu vergrößern, um alle Controls darzustellen. Verkleinern funktioniert aber.
Also bietet es sich an, die Form-Größe auf einen hinreichend großen Wert zu setzen und dann AutoSize auf true zu schalten. Siehe auch unten.

und das Formular ist "dank" AutoSize nicht einmal mehr manuell zoombar
Davon war zuvor nach meiner Erinnerung keine Rede, aber auch hier kann Dir geholfen werden:
Delphi-Quellcode:
aForm.AutoSize := true;
aForm.AutoSize := false;
Grüße,
blauweiss
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#40

AW: Mehrere Formulare an Stringgridgröße anpassen

  Alt 2. Nov 2010, 11:59
Dein Code ist nicht effizienter, sondern 1. unleserlich und 2. weniger performant, da bei Dir x-mal die Spaltenbreite eines StringGrids geändert wird, bei mir nur 1-mal.
Zweites ist richtig, wie ich nunmehr einsehe. Ich werde die Spaltenbreitenanpassung des Stringgrids diesbezüglich verändern (es zumindest versuchen). Edit: Es gelang. Allerdings sehe ich es weiterhin als ein wenig günstiger an, die Spaltenbreitenmessung nicht einzunullen, sondern gleich mit den Zellenbreiten irgendeiner Zeile (beispielsweise mit den Einträgen des Tabellenkopfes) zu beginnen.

Der Löwenanteil an der Langsamkeit meines Codes steckt allerdings in der Größenanpassung des Formulares: Pixelweise (!) wird dessen Größe verändert und jedesmal das Vorhandensein eines Scrollbalkens geprüft. Dafür ist das Formualar dann aber auch exakt angepaßt. Nur nach der Stringgridgröße zu gehen, funktioniert nämlich aufgrund der verschiedenen "Themes" in XP, Vista, 7 & Co. (Luna, Aero...) nicht so, wie es mir vorschwebt.

Das mit dem Constrain stimmt: Das Fenster ist merkwürdigerweise auf 112 Pixel (das Minimum) voreingestellt, so daß die Dekrementierungsschleife natürlich endlos wird. Merkwürdig, wenn die Codezeilen direkt verwende, funktionieren sie tadellos.... Danke auch für diesen Hinweis!
Ich will Dir nicht zu nahe treten, aber das halte ich für ausgeschlossen.
112 Pixel als Formularbreite lassen sich nach meiner Recherche nicht unterschreiten. Doch das ist ohnehin obsolet, weil der Prozeduraufruf fehlerhaft war.

Deine Reaktion auf Foristen, die Dir helfen wollen, ist ungewöhnlich. Die Herangehensweise an Deine Probleme, Deine Problembeschreibungen sowie die Reaktion auf Vorschläge Anderer scheint mir nicht professionell. Das ist nicht überheblich, denn Du wirst wohl nicht professionell (beruflich) programmieren, oder ?
Diese wohl eher rhetorisch gemeinte Frage dürfte schon mein selbstredendes Pseudonym beantworten. Nun, ich fragte ursprünglich, wie man die Formulargrößeanpassung in einem Unterprogramm vereinigen, zentralisieren kann, so daß man den dafür relevanten Code nicht mehrmals im Programm aufführen muß. Den entscheidenden Hinweis dazu erhielt ich (auf den ich nicht kam und auch nie gekommen wäre, weil er mit meinen aus Turbo-Pascal-Zeiten erworbenen Pascal-Kenntnissen nicht kompabitbel ist). Das andere, was hier zusätzlich noch kam, fragte ich gar nicht, doch auch das nehme ich als Anregungen gern und dankend mit und probiere auch einen Großteil davon aus und übernehme es ggf. - auch wenn ich mich nicht zu allem äußere. Du kannst aber nicht erwarten, daß ich alles, was ich an Hinweisen bekomme, auch umsetze oder auch nur vorbehaltlos und unkritisch gutheiße, nur, weil Du vielleicht ein (studierter) Informatiker und/oder ein beruflicher Programmierer bist. Zudem weiß ich, welche Mühe eine Forumstätigkeit schon dann macht, wenn man um die fachlichen Antworten nicht verlegen ist, und weiß deshalb Hilfe durchaus zu schätzen (schau mal, in wievielen Diskussionen nicht einmal ein einziger Dank kommt!). Solltest Du anzudeuten beabsichtigen, daß ich undankbar und/oder ein unbelehrbarer Sturkopf sei, dann verwahre ich mich dagegen.

Gruß

Delphi-Laie

Geändert von Delphi-Laie ( 2. Nov 2010 um 14:31 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:40 Uhr.
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