![]() |
[StringGrid] berechnen d. Zellenbreite nach resize
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.
Bin sonst nur als aktiver Leser hier im Forum und konnte bisher alle meine Fragen mit der Suchfunktion lösen! Diesmal stellt sich mir aber ein Problem das scheinbar noch niemanden interessiert hat :?. Auch Google hat nix zu dem Thema. Also, ich habe ein StringGrid und möchte bei resize die Spaltenbreite/höhe entsprechend berechnen.
Delphi-Quellcode:
Leider wird ein Teil der letzten Zelle(n) verdeckt.
procedure TForm_Jahrestest.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean); var iZelle, iHeader: Integer; begin Resize:= true; JahresGrid.DoubleBuffered:= true; // Höhe d. StringGridZellen iHeader:= 15; // mindesthöhe iZelle:= (JahresGrid.Height -iHeader) div 12; iHeader:= (JahresGrid.Height - (iZelle * 12)); JahresGrid.DefaultRowHeight:= iZelle; // iZelle -3 dann gehts JahresGrid.RowHeights[0]:= iHeader; // Breite d. Zellen iHeader:= 55; // mindestbreite iZelle:= ((JahresGrid.Width -iHeader) div 37); iHeader:= (JahresGrid.Width -(iZelle * 37)); JahresGrid.DefaultColWidth:= iZelle; JahresGrid.ColWidths[0]:= iHeader; end; Was zum Geier mache ich falsch? -> siehe Bild Ich hoffe jemand weiss wie man das logisch berechnet? PS: Hab jetzt nur den relevanten Code rauskopiert aber bei Bedarf kann ich das ganze Projekt auch posten. Danke, Cornel |
Re: [StringGrid] berechnen d. Zellenbreite nach resize
Hallo,
Rahmen-, Srollbar- und die Gitterlinienbreite in die Berechnung einbeziehen, das Grid hat 5 Spalten. ClientWidth ist gleich Width - Rand - Scrollbar
Delphi-Quellcode:
var iFixCol : Integer;
begin iFixCol := 50; StringGrid1.DefaultColWidth := ((StringGrid1.ClientWidth-iFixCol) div 4) - StringGrid1.GridLineWidth; StringGrid1.ColWidths[0] := iFixCol+(StringGrid1.ClientWidth-iFixCol) mod 4; //.. showmessage('Achtung! Differenz: '+IntToStr(StringGrid1.Width-StringGrid1.ClientWidth)); |
Re: [StringGrid] berechnen d. Zellenbreite nach resize
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Lannes. :)
:thumb: funktioniert Super. Danke Mit
Delphi-Quellcode:
hatte ich es auch schon versucht, allerdings hatte mich die Hilfe ein wenig verwirrt
StringGrid.ClientWidth
Zitat:
Habs jetzt so gemacht
Delphi-Quellcode:
with JahresGrid do begin
// Höhe d. StringGridZellen iFixCol:= 12; DefaultRowHeight:= ((ClientHeight -iFixCol) div 12) -GridLineWidth; Jahresgrid.RowHeights[0]:= (iFixCol -1 {warum?}) +(ClientHeight -iFixCol) mod 12; // Breite d. Zellen iFixCol:= 55; DefaultColWidth:= ((ClientWidth -iFixCol) div 37) -GridLineWidth; ColWidths[0]:= (iFixCol -1) +(ClientWidth -iFixCol) mod 37; end; |
AW: [StringGrid] berechnen d. Zellenbreite nach resize
Bisl alt das Thema, aber:
danke Buddelfink für die Frage und Lannes für die Antwort. Erspart ein neues Thema :-D |
AW: [StringGrid] berechnen d. Zellenbreite nach resize
Wenn man einfach nur mit DIV arbeitet, passen die Spalten natürlich in das Grid, ohne das der Scrollbalken erscheint. Je nach Gridgröße entsteht dann aber am rechten Rand eine mehr oder weniger große weiße Fläche, die nicht zu einer Zelle gehört.
Wenn man immer die gesamte Gridfläche verwenden möchte, ohne das der Scrollbaken erscheint, verwendet man z.B. folgenden Code...
Delphi-Quellcode:
procedure StringGridResize(Grid: TStringGrid);
var i, w, cols, line:integer; begin cols:=Grid.ColCount; line:=Grid.GridLineWidth; w:=0; for i:=1 to cols do begin Grid.ColWidths[i-1]:= (Grid.Canvas.ClipRect.Right - w - (line * (cols - i))) div (cols - i + 1); w:=w + Grid.ColWidths[i-1] + line; end; end; |
AW: [StringGrid] berechnen d. Zellenbreite nach resize
omata - noch besser - danke dir! :thumb:
|
AW: [StringGrid] berechnen d. Zellenbreite nach resize
@Omata: zu früh gefreut, löscht leider den ganzen Inhalt.. :?
|
AW: [StringGrid] berechnen d. Zellenbreite nach resize
Wie/wo zeichnset du?
|
AW: [StringGrid] berechnen d. Zellenbreite nach resize
Zitat:
|
AW: [StringGrid] berechnen d. Zellenbreite nach resize
Ich weiß auch nicht, warum das passiert. Hab die Procedure mal aufgerufen, nu seh ich nur noch n blankes Canvas (zuerst nach dem Füllen der Zellen aufgerufen, danach davor - wegen des gelöschten Inhaltes). Naja, ich seh mir des nochmal genauer an.. :)
|
AW: [StringGrid] berechnen d. Zellenbreite nach resize
Hallo,
Zitat:
Heiko |
AW: [StringGrid] berechnen d. Zellenbreite nach resize
Nö, im FormCreate (hab feste Breiten, wollte aber - so wie von Omata beschrieben - die weißen "Ränder weghaben").
Ich setz mich jetzt gleich mal ran und frickel mir det zurecht.. |
AW: [StringGrid] berechnen d. Zellenbreite nach resize
Hallo Buddelflink,
wie hast du das gemacht dass einen Kalender in einem Stringgrid angezeigt wird? Kann du mal bitte ein Beispiel zeigen! danke. |
AW: [StringGrid] berechnen d. Zellenbreite nach resize
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
In der Unit DateUtils findest du zahlreiche nützliche Funktionen wie z.B. DayOfTheWeek, DaysInMonth und WeekOfTheYear. Es gibt mehrere Wege, die nach Rom (zum Ziel) führen, daher möchte ich deiner Lernfähigkeit nicht im Wege stehen, indem ich hier den vollständigen Code reinstelle. Mit anderen Worten: Selber ausprobieren heißt die Devise. Für die Kalenderdarstellung einer Terminverwaltung hab ich einige Tage aus- und rumprobiert, auch mal die Hilfe eines Delphi-Forums in Anspruch genommen bei ganz gezielten Fragen. Dagegen wird dir die pauschale Frage, wie man einen Kalender programmiert, wohl kaum einer beantworten wollen. |
AW: [StringGrid] berechnen d. Zellenbreite nach resize
Zitat:
Form:
Delphi-Quellcode:
und die Klasse, die das gesamte Handling übernimmt:
unit MainView;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, uStringGridCalendar, Vcl.StdCtrls, Vcl.ExtCtrls; type TForm1 = class( TForm ) StringGrid1 : TStringGrid; Button1 : TButton; Button2 : TButton; Panel1: TPanel; procedure FormCreate( Sender : TObject ); procedure FormDestroy( Sender : TObject ); procedure Button1Click( Sender : TObject ); procedure Button2Click( Sender : TObject ); private { Private-Deklarationen } FCal : TStringGridCalendar; public { Public-Deklarationen } end; var Form1 : TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click( Sender : TObject ); begin FCal.DoIncYear( 1 ); end; procedure TForm1.Button2Click( Sender : TObject ); begin FCal.DoIncYear( -1 ); end; procedure TForm1.FormCreate( Sender : TObject ); begin FCal := TStringGridCalendar.Create( StringGrid1 ); end; procedure TForm1.FormDestroy( Sender : TObject ); begin FCal.Free; end; end.
Delphi-Quellcode:
Diese Klasse kann man nun noch um beliebige Features erweitern um die Anzeige aufzuhübschen oder weitere Funktionalitäten anzupassen.
unit uStringGridCalendar;
interface uses Vcl.Grids; type TStringGridCalendar = class private FGrid : TStringGrid; FSelDate : TDate; procedure SetSelDate( const Value : TDate ); protected procedure GridSelectCell( Sender : TObject; ACol, ARow : Integer; var CanSelect : Boolean ); procedure DoGridDataFill; function TryGetDateFromGrid( ACol, ARow : Integer; out aDate : TDate ) : Boolean; function GetDateFromGrid( ACol, ARow : Integer ) : TDate; public constructor Create( aStringGrid : TStringGrid ); property SelDate : TDate read FSelDate write SetSelDate; procedure DoIncYear( aValue : Integer ); end; implementation uses System.SysUtils, System.DateUtils; { TStringGridCalendar } constructor TStringGridCalendar.Create( aStringGrid : TStringGrid ); begin inherited Create; FGrid := aStringGrid; FGrid.Options := FGrid.Options - [goRangeSelect]; FGrid.OnSelectCell := GridSelectCell; FSelDate := Date; DoGridDataFill; end; procedure TStringGridCalendar.DoGridDataFill; var idx : Integer; DateIdx : TDate; lRow, lCol : Integer; begin FGrid.FixedCols := 1; FGrid.FixedRows := 1; FGrid.ColCount := 38; FGrid.RowCount := MonthsPerYear + FGrid.FixedRows; // Jahreszahl in die erste Zelle FGrid.Cells[0, 0] := IntToStr( YearOf( SelDate ) ); // Tagesnamen in die erste Zeile for idx := FGrid.FixedCols to Pred( FGrid.ColCount ) do begin FGrid.Cells[idx, 0] := ShortDayNames[( idx - FGrid.FixedCols + 1 ) mod DaysPerWeek + 1]; end; // Monatsnamen in die erste Spalte for idx := FGrid.FixedRows to Pred( FGrid.RowCount ) do begin FGrid.Cells[0, idx] := LongMonthNames[idx - FGrid.FixedRows + 1]; end; for lRow := FGrid.FixedRows to Pred( FGrid.RowCount ) do begin for lCol := FGrid.FixedCols to Pred( FGrid.ColCount ) do begin if TryGetDateFromGrid( lCol, lRow, DateIdx ) then FGrid.Cells[lCol, lRow] := IntToStr( DayOf( DateIdx ) ) else FGrid.Cells[lCol, lRow] := ''; end; end; end; function TStringGridCalendar.GetDateFromGrid( ACol, ARow : Integer ) : TDate; begin if not TryGetDateFromGrid( ACol, ARow, Result ) then raise Exception.Create( 'Fehlermeldung' ); end; procedure TStringGridCalendar.GridSelectCell( Sender : TObject; ACol, ARow : Integer; var CanSelect : Boolean ); var lDate : TDate; begin if TryGetDateFromGrid( ACol, ARow, lDate ) then begin CanSelect := True; SelDate := lDate; end else CanSelect := False; end; procedure TStringGridCalendar.DoIncYear( aValue : Integer ); begin SelDate := IncYear( SelDate, aValue ) end; function TStringGridCalendar.TryGetDateFromGrid( ACol, ARow : Integer; out aDate : TDate ) : Boolean; var lMonth, lDay, lYear : Word; lMinCol, lMaxCol : Integer; begin Result := False; if ( ACol >= FGrid.FixedCols ) and ( ARow >= FGrid.FixedRows ) then begin lYear := YearOf( SelDate ); lMonth := ARow - FGrid.FixedRows + 1; aDate := EncodeDate( lYear, lMonth, 1 ); lMinCol := DayOfTheWeek( aDate ) + FGrid.FixedCols - 1; lMaxCol := lMinCol + DaysInMonth( aDate ) - 1; if ( ACol >= lMinCol ) and ( ACol <= lMaxCol ) then begin Result := True; lDay := ACol - lMinCol + 1; aDate := EncodeDate( lYear, lMonth, lDay ); end; end; end; procedure TStringGridCalendar.SetSelDate( const Value : TDate ); var lYearChange : Boolean; begin if ( Value <> SelDate ) then begin lYearChange := YearOf( Value ) <> YearOf( SelDate ); FSelDate := Value; if lYearChange then DoGridDataFill; end; end; end. |
AW: [StringGrid] berechnen d. Zellenbreite nach resize
vielen vielen dank!
an Sir Rifo |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:20 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