OnPaint feuert nicht

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: OnPaint feuert nicht

Beitrag von pluto »

Nach Bilden oder uns das Projekt zuverfügung stellen kannst du nicht oder? oder uns mehr Code zeigen.
Vielleicht ist das Event nicht verbunden im OI. Es kann an alles liegen.
MFG
Michael Springwald

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: OnPaint feuert nicht

Beitrag von Heinrich Wolf »

Der Quellcode liegt im Lazarus Bugtracker. Link zum Bugtracker von weiter oben hier nochmal:
http://bugs.freepascal.org/view.php?id=19488" onclick="window.open(this.href);return false;
Direktlink zom Quellcode dort:
http://bugs.freepascal.org/file_downloa ... 3&type=bug" onclick="window.open(this.href);return false;

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: OnPaint feuert nicht

Beitrag von shokwave »

Hi,

ich hab mir das Projekt mal angeschaut und mein Lazarus scheint mit den ganzen ifdefs Probleme zu haben. Er hat mir die Unit "Windows" angemeckert, obwohl er sie laut ifdef gar nicht beachten sollte. Ich habe es dann wie folgt geändert:

Code: Alles auswählen

uses
  {$ifdef UNIX}
    Sockets,
    LibC,
    BaseUnix,
  {$endif UNIX}
  {$ifdef WINDOWS}
    {$ifdef fpc}
      Sockets,
    {$endif fpc}
    WinSock,
    Windows,
  {$endif WINDOWS}
Jetzt werden im OI die Prozeduren korrekt angezeigt. Leider kann ich das Projekt nicht testen, da ich das gleiche Problem wie Juha habe.
mfg Ingo

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: OnPaint feuert nicht

Beitrag von Heinrich Wolf »

Das Problem mit den ifdefs hab ich auch. Bisher hatte ich keine Lösung. Aber Deine Idee ist gut! Allerdings muss das Symbol für Windows nicht Windows, sondern Win32 heißen.

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: OnPaint feuert nicht

Beitrag von shokwave »

Heinrich Wolf hat geschrieben:Allerdings muss das Symbol für Windows nicht Windows, sondern Win32 heißen.
Dann wird aber Windows 64-bit ausgeschlossen.
test for families of OSes.

{$ifdef MSWindows}
// ce + win32 + win64, delphi compat
{$endif]
{$ifdef Windows}
// ce + win32 + win64, more logical.
{$endif]
{$ifdef Unix}
// all Unix like OSes. Linux/*BSD/OS X and Solaris. BeOS too if it ever released again.
{$endif}
{$ifdef BSD}
// Free/Net/OpenBSD and Mac OS X
{$endif}

Specific OSes

{$ifdef win32}
// 95/98/ME and 32-bit NT/2k/XP/Vista
{$endif}
{$ifdef win64}
// 64-bit/XP/Vista
{$endif}
{$ifdef wince}
// Windows CE family including PocketPC 2003 and Windows Mobile 5
{$endif}
{$ifdef Linux}
// linux}
{$endif}
{$ifdef FreeBSD}
// FreeBSD
{$endif}
{$ifdef Darwin}
// Darwin is the base OS name of Mac OS X, like NT is the name of the Win2k/XP/Vista kernel. Mac OS X = Darwin + GUI.
{$endif}
{$ifdef SunOS}
// similarly with Solaris. Ifdef solaris also works though.
{$endif}
// additionally OS2 , netware, netwlibc (Linux based Novell), BeOS, AmigaOS.
siehe http://delphi.wikia.com/wiki/FreePascal ... versioning
mfg Ingo

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: OnPaint feuert nicht

Beitrag von Heinrich Wolf »

Das Projekt soll laufen auf
  • Lazarus Linux 32 Bit,
    Lazarus Windows 32 Bit und
    Delphi 5
Ich hab noch kein 64 Bit Betriebssystem.
Und ich hab schon Antworten gekriegt, dass es auf Linux 64 Bit nicht compilierbar ist, weil ich die LibC verwende.
Delphi 5 definiert nur Win32, nicht MSWindows
Zuletzt geändert von Heinrich Wolf am Mi 8. Jun 2011, 21:27, insgesamt 2-mal geändert.

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: OnPaint feuert nicht

Beitrag von Heinrich Wolf »

Mit

Code: Alles auswählen

Uses
{$ifdef Unix}
  LibC,
{$endif}
{$ifdef Win32}
  Windows,
{$endif}
an Stelle von

Code: Alles auswählen

Uses
{$ifdef Unix}
  LibC,
{$else}
  Windows,
{$endif}
läuft mein Projekt unverändert auf meinen Zielplatformen
  • Lazarus Linux 32 Bit,
    Lazarus Windows 32 Bit und
    Delphi 5
Jetzt beschwert sich die Linux IDE nicht mehr über "Windows nicht gefunden" und ich kann im Objekt Inspektor von MainForm aus der Liste der Event Handler auswählen. Aber OnPaint von MainForm feuert auf Linux immer noch nicht.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: OnPaint feuert nicht

Beitrag von pluto »

Lösch mal alle *.ppu und *.o Dateien in deinen Verzeichnis.
MFG
Michael Springwald

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: OnPaint feuert nicht

Beitrag von Heinrich Wolf »

Alle *.ppu und *.o lösche ich sowieso schon immer wieder. Das beseitigt den OnPaint Fehler nicht.

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: OnPaint feuert nicht

Beitrag von shokwave »

Ich hab zwar keine Ahnung warum der OnPaint nicht ausgelöst wird, aber so wie ich den Code verstehe

Code: Alles auswählen

procedure TMainForm.FormPaint(Sender: TObject);
  begin
    if Start then
      begin
        Start := False;
        NewColors;
        InitNetwork;
        ShowPanel(True);
        NetworkThread := tNetworkThread.Create(False);
      end;
  end;
wird der nur ein mal bei Programmstart aufgerufen. Wenn das stimmt, kannst du auch das OnShow-Ereignis verwenden.
mfg Ingo

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: OnPaint feuert nicht

Beitrag von Socke »

shokwave hat geschrieben:wird der nur ein mal bei Programmstart aufgerufen. Wenn das stimmt, kannst du auch das OnShow-Ereignis verwenden.
Wir wärs mit AddFirstShowHandler()? Dann wird die Funktion auch nur einmal aufgerufen (beim ersten Anzeigen).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: OnPaint feuert nicht

Beitrag von shokwave »

Klingt interessant. Kann leider nix dazu finden. Wo kommt die her (Unit)?
mfg Ingo

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: OnPaint feuert nicht

Beitrag von Socke »

Sry, Hatte mich verschrieben; vollständig heißt’s:

Code: Alles auswählen

TCustomForm.AddHandlerFirstShow();
existiert also in jedem Formular; Funktionsweise ist denkbar einfach: einfach während des Konstruktors (OnCreate gehört auch dazu) aufrufen und alles wird beim ersten Anzeigen abgearbeitet.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: OnPaint feuert nicht

Beitrag von Heinrich Wolf »

Ich habe einen Breakpoint gesetzt in lcl/include/customcontrol.inc auf

Code: Alles auswählen

procedure TCustomControl.Paint;
begin
  if Assigned(FOnPaint) then FOnPaint(Self);
end;
Auf Windows wird dieser Breakpoint getriggert für Mainform, Panel and ToolBar.
Auf Linux wird dieser Breakpoint nur für Panel and ToolBar getriggert.

@shokwave: Kurz bevor ich Deinen Beitrag gelesen hab, hatte ich dieselbe Idee mit OnShow. Damit ist die Funktion auch bei Linux wieder hergestellt. Danke!
@Socke: AddHandlerFirstShow ist eine schöne Sache! Leider wird das nicht von Delphi 5 unterstützt.

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: OnPaint feuert nicht

Beitrag von Heinrich Wolf »

Vielleicht ging das ja noch nie.

Im letzten funktionierenden Code vor den ganzen Änderungen war OnPaint ein unwichtiger Code, den man nicht bemerkte, wenn er nicht ausgeführt wurde. Der wichtige Code, der den NetworkThread erzeugte, war damals in OnCreate drin.

Take it easy für Linux ist aus Take it easy für Delphi 5 entstanden. Erst mal habe ich den Code von Delphi 5 getrennt und an Linux angepasst. Bei den letzten Änderungen habe ich die *.pas über ifdef wieder mit Delphi 5 zusammengeführt. Dabei habe ich das Erzeugen des NetworkThread nach OnPaint verschoben. Nach den letzten Erfahrungen und der erfreulichen Hilfe hier habe ich das Erzeugen des NetworkThread sowohl für Delphi 5, als auch für Linux nach OnShow verschoben.

Das aktuelle Projekt liegt hier:
http://www.Wolf-Fuerth.de/
http://www.Wolf-Fuerth.de/tewin_de.htm
http://www.Wolf-Fuerth.de/downl1de.htm#TeLinux
http://www.Wolf-Fuerth.de/takeeasy.src.zip

Antworten