Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Performance erhöhen bei einem Kalender (https://www.delphipraxis.net/3176-performance-erhoehen-bei-einem-kalender.html)

mika 27. Feb 2003 09:41


Performance erhöhen bei einem Kalender
 
Hallo an alle,

ich schreibe an einem Kalender/Planer in dem man sachen eintragen kann.
Weil das ganze für Firmen ist die z.B. den Urlaub ihrer Mitarbeiter
damit planen wollen habe ich mich dazuentschlossen das ganze nicht
als Komponente von irgendwoher zu nehmen sondern das selber zu schreiben.

So habe ich mir ein Objekt erstellt (abgeleitet von TShape) mit dem
ich jeden Tag als kleines Rechteck darstelle. Nun habe ich aber das Problem
das das ganze schon bei 70 Leuten und einem Jahr (also 70 Zeilen,
365 Spalten) sehr langsam lädt (ich habe nach 5 minuten abgebrochen). Bei
70 Leuten und einem Monat brauch ich immer noch 10 sekunden und ich habe
das Gefühl je mehr ich von den Kästchen erstelle desto länger braucht er
pro Kästchen.

Ich dachte mir ich packe das ganze mal in einen Thread den ich beim starten
des Kalenders einfach aufrufe, meinetwegen auch mit einer höherer Priorität
damit das ganze mal ein bisschen an Performance zulegt. Als zweite
überlegen kam mir das ich aus dem Thread ein Array mache (dynamisches) und
einfach für jede Zeile einen Thread starte der mir dann die lustigen
Kästchen zeichnet. Würde es schneller gehen wenn ich den Array für
die Shapes vorher bereitstelle und jedem Thread einfach sage fülle
den Array von 1 - 300, 2ter Thread fülle Array von 301 bis 600 und so
weiter?

Hat jemand von euch schon mal was ähnlcihes gemacht?

mika 27. Feb 2003 09:45

nochmal ich
 
Hier nochmal n bisschen Code von mir, vielleicht habe ich
ja auch da was falsches drinne ?!

Delphi-Quellcode:
  TMyCoords = Packed Record
    Column: Word;
    Row: Word;
    Top: Word;
    Left: Word;
    Bottom: Word;
    Right: Word;
  End;

  TMyInformation = Packed Record
    msdDay: TDate;
    msdWDay: String[12];
    msdPerson: String[50];
    msdPersonNR: String[5];
    msdActualKosten: String[5];
    msdNormalKosten: String[5];
  End;

  TCreateIt = Record
    _ID: Integer;
    Top: Integer;
    Left: Integer;
    State: Word;
    _Date: TDate;
    col: integer;
    row: Integer;
    coords: TMyCoords;
    _Caption: String;
    _Color: TColor;
    Person: String;
  End;

  TMySpecialDay = class(TShape)

    mytitel: TStaticText;
    constructor NCreate ( how: TCreateIt ); // Constructor
    destructor Destroy; override;         // Destructor

    private
      msdID: Integer;
      msdState: Word;
      // ---
      msdCoords: TMyCoords;
      msdInfo: TMyInformation;
      // ---
      msdChanged: Boolean;
      msdStatebeforeChange: Word;
      msdSelected: Boolean;
      public
      procedure onMyMouseDown(Sender: TObject; Button: TMouseButton;
                              Shift: TShiftState; X, Y: Integer);
      procedure onMyMouseMove(Sender: TObject; Shift: TShiftState; X,
                              Y: Integer);
      procedure onMyMouseUp(Sender: TObject; Button: TMouseButton;
                            Shift: TShiftState; X, Y: Integer);
      procedure CreateLabel(var Lbl: TStaticText;
                                X,Y,W,H: Integer;
                                BorderStyle: TStaticBorderStyle;
                                Color,FontColor: TColor;
                                FontStyle: TFontStyles;
                                Capt: String;
                                Align: TAlignment;
                                FontSize: Integer);
  end;

constructor TMySpecialDay.NCreate ( how: TCreateIt );
Begin
  // Erstellen
  Create (f_planer.sKalender);
  Parent := f_planer.sKalender;
  INC (mySDCount);

  // Konfigurieren
  msdID := how._ID;
  msdState := how.State;
  msdInfo.msdDay := how._Date;
  msdInfo.msdWDay := f_planer.daytoStr(DayOfTheWeek(how._Date));
  msdInfo.msdPerson := how._Caption;
  msdInfo.msdPersonNr := how.Person;
  msdCoords := how.Coords;
  Case msdState of
    msdDontUse   : begin
                      Brush.Color := mscDontUse;
                    end;
  end;

  // Ausrichten
  SetBounds(how.Left, how.top, msdWidth, msdHeight);

  // Methoden und Ereignisse anhängen
  if msdState <> msdDontUse then
  Begin
    OnMouseDown := onMyMouseDown;
    OnMouseMove := onMyMouseMove;
    OnMouseUp := onMyMouseUp;
    msdChanged := False;
    msdSelected := False;
  End;
End;

destructor TMySpecialDay.Destroy;
Begin
  Inherited Destroy;
End;
vielleicht hilft das ja auch noch weiter.

mfg, Mika


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