Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Aktualisierung des Fensters für eine bestimmte Zeit unterdrücken? (https://www.delphipraxis.net/163432-aktualisierung-des-fensters-fuer-eine-bestimmte-zeit-unterdruecken.html)

loirad 28. Sep 2011 18:07

Aktualisierung des Fensters für eine bestimmte Zeit unterdrücken?
 
Hallo ihr,
wie kann man die Aktualisierung des Fensters für eine bestimmte Zeit unterdrücken, damit es nicht so flackert?
Liebe Grüße
loirad

DeddyH 28. Sep 2011 18:37

AW: Aktualisierung des Fensters für eine bestimmte Zeit unterdrücken?
 
MSDN-Library durchsuchenLockWindowUpdate und MSDN-Library durchsuchenWM_SETREDRAW fallen mir als Erstes ein.

Nersgatt 28. Sep 2011 18:48

AW: Aktualisierung des Fensters für eine bestimmte Zeit unterdrücken?
 
Wenn es nur um bestimmte Controls geht, schau erst mal, ob es ein .beginUpdate und .endUpdate gibt. Z.B. Grids haben sowas gern. Ist meiner Meinung nach die schönste Lösung. Wenn es das nicht gibt: siehe DeddyH.
Und immer schön einen Try-Finally-Block drumrum packen.

uligerhardt 28. Sep 2011 19:26

AW: Aktualisierung des Fensters für eine bestimmte Zeit unterdrücken?
 
Zitat:

Zitat von DeddyH (Beitrag 1127305)
MSDN-Library durchsuchenLockWindowUpdate und MSDN-Library durchsuchenWM_SETREDRAW fallen mir als Erstes ein.

LockWindowUpdate lieber nicht.

DeddyH 28. Sep 2011 19:30

AW: Aktualisierung des Fensters für eine bestimmte Zeit unterdrücken?
 
Toll, mal wieder etwas, was man irgendwie nicht benutzen kann, ohne Fehler zu riskieren.

loirad 29. Sep 2011 17:31

AW: Aktualisierung des Fensters für eine bestimmte Zeit unterdrücken?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von uligerhardt (Beitrag 1127309)
Zitat:

Zitat von DeddyH (Beitrag 1127305)
MSDN-Library durchsuchenLockWindowUpdate und MSDN-Library durchsuchenWM_SETREDRAW fallen mir als Erstes ein.

LockWindowUpdate lieber nicht.

Hallo ihr,
ich weiß nicht, wie man WM_SETREDRAW aufruft oder so???
außerdem habe ich ein weiteres Problem bei meinem Kalenderprojekt. Ich möchte für jeden Tag eine Listbox einfügen. Jedoch sind immer zu wenig Listboxen da --> ich häng mal die exe an --> guckt es euch an bitte!
Hier der Quelltext:
Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, Grids, StdCtrls, DateUtils;

type
  TForm1 = class(TForm)
    Kalender: TStringGrid;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Beenden1: TMenuItem;
    Monat: TLabel;
    zuruek: TButton;
    vor: TButton;
    procedure FormCreate(Sender: TObject);
    function welchermonat(Monat:string):string;
    procedure vorClick(Sender: TObject);
    procedure fuellen(Monat,Jahr, Wochentag: integer);
    procedure clear;
    function Wochentag(Datum:TDateTime):integer;
    procedure zuruekClick(Sender: TObject);
    procedure KalenderDblClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure KalenderDrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure setRect(rec:Trect;Nummer:integer);
    procedure Listboxcreate(Listbox:TListbox;Nummer:integer);
    procedure listboxenverteilen;
  private
    { Private-Deklarationen }
    taga,mona,monatsnamea,jahra,tag,mon,monatsname,jahr:String;
    dat:TDateTime;
    L: array [1..31] of TListbox;
    day:integer;
  public
    { Public-Deklarationen }
    Nameu,VonT,BisT,VonZ,BisZ,Wiederholung,Inhalt:string;
    neuerText:boolean;  
  end;

var
  Form1: TForm1;
  L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11,L12,L13,L14,L15,L16,
  L17,L18,L19,L20,L21,L22,L23,L24,L25,L26,L27,L28,L29,L30,
  L31:TListbox;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
neuerText:=false;
Kalender.Top:=20;
Kalender.Left:=0;
Kalender.Width:=Form1.ClientWidth;
Kalender.Height:=Form1.ClientHeight-20;
Kalender.DefaultColWidth:=(Kalender.Width div 7)-2;
Kalender.DefaultRowHeight:=(Kalender.Height div 7)-2;
Kalender.Cells[0,0]:='Montag';
Kalender.Cells[1,0]:='Dienstag';
Kalender.Cells[2,0]:='Mittwoch';
Kalender.Cells[3,0]:='Donnerstag';
Kalender.Cells[4,0]:='Freitag';
Kalender.Cells[5,0]:='Samstag';
Kalender.Cells[6,0]:='Sonntag';
Monat.Top:=0;
Monat.Left:=Form1.ClientWidth div 2 - Monat.Width div 2;
zuruek.Left:=0;
zuruek.Top:=0;
vor.Top:=0;
vor.Left:=Form1.ClientWidth-vor.Width;
dat:=now;
taga:=FormatDateTime('d',dat);
mona:=FormatDateTime('m',dat);
jahra:=FormatDateTime('yyyy',dat);
monatsnamea:=welchermonat(mona);
Form1.Caption:='Kalender - '+taga+'. '+monatsnamea+' '+jahra;
Monat.Caption:=monatsnamea+' '+jahra;
day:=Wochentag(strtodate('01.'+mona+'.'+jahra));
fuellen(strtoint(mona),strtoint(jahra),day);
tag:=taga;
mon:=mona;
monatsname:=monatsnamea;
jahr:=jahra;
listboxenverteilen;
end;

function TForm1.welchermonat(Monat: String): string;
begin
case strtoint(Monat) of
 1:result:='Januar';
 2:result:='Februar';
 3:result:='März';
 4:result:='April';
 5:result:='Mai';
 6:result:='Juni';
 7:result:='Juli';
 8:result:='August';
 9:result:='September';
 10:result:='Oktober';
 11:result:='November';
 12:result:='Dezember';
end;
end;

procedure TForm1.vorClick(Sender: TObject);
begin
clear;
if strtoint(mon)<12 then
 mon:=inttostr(1+strtoint(mon))
else
 begin
  mon:='1';
  jahr:=inttostr(1+strtoint(jahr));
 end;
fuellen(strtoint(mon),strtoint(jahr),Wochentag(strtodate('01.'+mon+'.'+jahr)));
monatsname:=welchermonat(mon);
Monat.Caption:=monatsname+' '+jahr;
day:=Wochentag(strtodate('01.'+mon+'.'+jahr));
listboxenverteilen;
end;

procedure TForm1.fuellen(Monat, Jahr, Wochentag: integer);
var i,j,z:integer;
begin
i:=1;
z:=1;
j:=Wochentag-1;
repeat
 Kalender.Cells[j,z]:=inttostr(i)+'. '+welchermonat(inttostr(Monat))+' '+inttostr(Jahr);
 if j<6 then
  begin
   inc(j);
  end
 else
  begin
   inc(z);
   j:=0;
  end;
 inc(i);
until i>Daysinamonth(Jahr,Monat);
end;

procedure TForm1.clear;
var i,j:integer;
begin
for i:=0 to Kalender.ColCount do
 for j:=1 to Kalender.RowCount do
  Kalender.Cells[i,j]:='';
for i:=1 to Length(L) do
  L[i].Free;
fillchar(L,sizeOf(L),0) ;
end;

function TForm1.Wochentag(Datum: TDateTime): integer;
begin
case DayOfWeek(Datum) of
 1: Result := 7;
 2: Result := 1;
 3: Result := 2;
 4: Result := 3;
 5: Result := 4;
 6: Result := 5;
 7: Result := 6;
end;
end;

procedure TForm1.zuruekClick(Sender: TObject);
begin
Form1.Hide;
clear;
if strtoint(mon)>1 then
 mon:=inttostr(strtoint(mon)-1)
else
 begin
  mon:='12';
  jahr:=inttostr(strtoint(jahr)-1);
 end;
fuellen(strtoint(mon),strtoint(jahr),Wochentag(strtodate('01.'+mon+'.'+jahr)));
monatsname:=welchermonat(mon);
Monat.Caption:=monatsname+' '+jahr;
day:=Wochentag(strtodate('01.'+mon+'.'+jahr));
listboxenverteilen;
Form1.Show;
end;

procedure TForm1.KalenderDblClick(Sender: TObject);
begin
if Kalender.Cells[Kalender.Selection.Left,Kalender.Selection.Top]<>'' then
 begin
  Form1.Enabled:=false;
  Form2.Show;
  Form2.Name.SetFocus;
  Inhalt:=Form1.Kalender.Cells[Form1.Kalender.Selection.Left,Form1.
  Kalender.Selection.Top]
 end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2.Close;
end;

procedure TForm1.KalenderDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
if Kalender.Cells[ACol,ARow]='' then
 begin
  Kalender.Canvas.Brush.Color := clMedGray;
  Kalender.Canvas.FillRect(Rect);
 end;
end;

procedure TForm1.setRect(rec: Trect;Nummer:integer);
var r:TRect;
begin
  CopyRect(r,rec);
  r.BottomRight:=L[Nummer].Parent.ScreenToClient(Kalender.ClientToScreen(r.BottomRight));
  r.TopLeft:=L[Nummer].Parent.ScreenToClient(Kalender.ClientToScreen(r.TopLeft));
  L[Nummer].SetBounds(r.Left,r.Top,r.Right-r.Left,r.Bottom-r.Top);
  L[Nummer].BringToFront;
end;

procedure TForm1.listboxenverteilen;                              //Hier müsste irgendwo der Fehler sein!
var x,y,i:integer;
begin
x:=day-1;
y:=1;
for i:=1 to 31{daysinamonth(strtoint(jahr),strtoint(mon))} do
 begin
  L[i]:=TListbox.Create(self);
  with L[i] do
    begin
      parent := Form1;
      name := 'L'+IntToStr(i);
      left := 10;
      top := i * 2;
      Width:=Form1.Kalender.DefaultColWidth;
     if x<7 then
      begin
       setRect(Kalender.CellRect(x,y),i);
       inc(x);
      end
     else
      begin
       x:=0;
       inc(y);
       setRect(Kalender.CellRect(x,y),i);
      end;
    end;
 end;

end;

end.
Vielen Dank für weitere Antworten
loirad!!!

uligerhardt 29. Sep 2011 18:16

AW: Aktualisierung des Fensters für eine bestimmte Zeit unterdrücken?
 
Zitat:

Zitat von loirad (Beitrag 1127539)
Zitat:

Zitat von uligerhardt (Beitrag 1127309)
Zitat:

Zitat von DeddyH (Beitrag 1127305)
MSDN-Library durchsuchenLockWindowUpdate und MSDN-Library durchsuchenWM_SETREDRAW fallen mir als Erstes ein.

LockWindowUpdate lieber nicht.

ich weiß nicht, wie man WM_SETREDRAW aufruft oder so???

In der Kurzfassung so:
Delphi-Quellcode:
  SendMessage(FHandle, WM_SETREDRAW, 0, 0);
  try
    // ...
  finally
    SendMessage(FHandle, WM_SETREDRAW, 1, 0);
    RedrawWindow(FHandle, nil, 0,
      RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN);
  end;
wobei FHandle ein HWND (z.B. ListBox1.Handle) ist.

loirad 30. Sep 2011 20:20

AW: Aktualisierung des Fensters für eine bestimmte Zeit unterdrücken?
 
Danke! hat irgendjemand vielleicht noch ideen, warum zu wenig checkboxen angezeigt werden?
Liebe Grüße loirad!

Luckie 30. Sep 2011 20:27

AW: Aktualisierung des Fensters für eine bestimmte Zeit unterdrücken?
 
Für eine neue Frage erstell biet eine neuen Beitrag.


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