Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Probleme mit Bildschirmschonervorschau (https://www.delphipraxis.net/103569-probleme-mit-bildschirmschonervorschau.html)

Popov 18. Nov 2007 10:17

Re: Eine Frage die nur die Glaskugel beantworten werden kann
 
Ok, ich hab das Problem gefunden. Wie ich schon oben geschrieben habe liegt mein letzter Bildschirmschoner schon über ein halbes Jahr her, oder länger. Deshalb hab ich die eine oder andere Sache schon mal vergessen, und kein Bildschirmschoner ist gleich wie die anderen. Manchmal muß man nur etwas über das Problem quatschen um selbst auf die Lösung zu kommen, denn dabei denkt man oft an Sachen die man vorher nicht beachtet hat.

Der schuldige Part ist der hier:

Delphi-Quellcode:
OldStyle := GetWindowLong(Handle, GWL_STYLE);
SetWindowLong(Handle, GWL_STYLE, (OldStyle and not WS_POPUP) or WS_CHILD or WS_VISIBLE);
Ich hab die zwei Zeilen nicht vergessen, aber ihre Bedeutung nicht mehr im Kopf gehabt. Außerdem habe ich die Reihenfolge falsch gesetzt, so daß die oberen Zeilen nicht funktionierten. Und deshalb hab ich sie irgendwann entfernt.

Das hier funktioniert NICHT:

Delphi-Quellcode:
procedure TPreview.FormCreate(Sender: TObject);
var
  OldStyle: Integer;
  hWnd: THandle;
  Rec: TRect;
begin
  hWnd := StrToIntDef(ParamStr(2), 0);
  GetWindowRect(hWnd, Rec);
  SetBounds(0, 0, Rec.Right - Rec.Left, Rec.Bottom - Rec.Top);

  OldStyle := GetWindowLong(Handle, GWL_STYLE);
  SetWindowLong(Handle, GWL_STYLE, (OldStyle and not WS_POPUP) or WS_CHILD or WS_VISIBLE);

  BorderStyle := bsNone; // <<<<<<<<<< NACH

  Windows.SetParent(Self.Handle, hWnd);
end;
Das hier funktioniert korrekt:

Delphi-Quellcode:
procedure TPreview.FormCreate(Sender: TObject);
var
  OldStyle: Integer;
  hWnd: THandle;
  Rec: TRect;
begin
  hWnd := StrToIntDef(ParamStr(2), 0);
  GetWindowRect(hWnd, Rec);
  SetBounds(0, 0, Rec.Right - Rec.Left, Rec.Bottom - Rec.Top);

  BorderStyle := bsNone; // <<<<<<<<<< VOR

  OldStyle := GetWindowLong(Handle, GWL_STYLE);
  SetWindowLong(Handle, GWL_STYLE, (OldStyle and not WS_POPUP) or WS_CHILD or WS_VISIBLE);

  Windows.SetParent(Self.Handle, hWnd);
end;
Da mein letzter Bildschirmschoner schon länger her ist und ich das Preview Fenster jedes mal neu schreibe und dieses mal BorderStyle hinter SetWindowLong gesetzt habe und deshalb SetWindowLong keine Wirkung hatte und ich auf der Suche nach dem Fehler nach und nach alles entfernte und ganz einfach vergessen habe, daß beim Style einige Flags gesetzt werden müssen, habe ich letztendlich auch SetWindowLong entfernt.

Ich könnte mich jetzt versuchen rauszureden, ich hab es einfach vergessen. Vielleicht sollte ich mir mal ein Tutorial schrieben. Ich hatte mich mal wirklich ausführlich damit beschäftigt und jetzt passiert mir sowas. Man vergisst genauso schnell wie man es lernt.

Popov 18. Nov 2007 10:35

Re: Eine Frage die nur die Glaskugel beantworten werden kann
 
Zitat:

Zitat von hathor
Betrifft Directive - So geht's:

Delphi-Quellcode:
program NurTest;
...
{$R *.RES}
{$D SCRNSAVE : Test Screen Saver}
...
Offensichtlich darf bei meinem DELPHI 2007 diese Directive erst NACH der $R-Directive
auftauchen. Im Übrigen sieht man sie nur mit geeigneten Programmen, z.B. Hexeditor.
Siehe Anhänge.

Letztendlich ist es unwichtig. Früher hatte diese Direktive beim Bildschirmschoner eine Bedeutung. Auch wenn sie heute noch in so ziemlich jedem BS Tutorial steht, was zeigt, daß einige die Tutorials schreiben einfach nicht wissen was sie da schreiben, sondern einfach zum Teil nur abschreiben, so hat diese Direktive nicht die Funktion die sei früher hatte. Früher, in den 8.3 Zeiten, konnte man so dem Bildschirmschoner einen langen Namen geben. Seit Windows 9x hat diese Direktive keinen Einfluß auf den Namen. Zumindest nicht bei Delphi zwischen D3 und D7 und Windows 98 und XP. Ich hab alle Varianten getestet, keine Wirkung. Wenn ich also diese Zeile noch drin hatte, dann eher aus sentimentalen Gründen.

Allerdings gibt es tatsächlich eine Möglichkeit einen BS Namen unabhängig dem Datei Namen zu setzten. Nur ist mir der nicht bekannt. Auch wenn ich schon seit Jahren dran suche.

Luckie 18. Nov 2007 16:12

Re: Eine Frage die nur die Glaskugel beantworten werden kann
 
Warum hat der Threadtitel eigentlcih nichts mit dem Problem bzw. der Frage zu tun? :roll: Ich dachte eigentlich, dass du la´nge genug dabei bist, dass du wüsstest, wie man seinen Thread benennt.

Popov 18. Nov 2007 17:05

Re: Eine Frage die nur die Glaskugel beantworten werden kann
 
Zitat:

Zitat von Luckie
Warum hat der Threadtitel eigentlcih nichts mit dem Problem bzw. der Frage zu tun? :roll: Ich dachte eigentlich, dass du la´nge genug dabei bist, dass du wüsstest, wie man seinen Thread benennt.

Wenn du dir den Text im ersten Beitrag durchliest, dann wirst du erkennen, daß das Problem gar nicht klar war. Erst im Laufe des Threads hat sich nach und nach rausgestellt, daß es die Bildschirmschoner Preview war, bis zuletzt das Problem erkannt wurde.

Warum dann aber nicht gleich geschrieben, daß es ein Bildschirmschoner Problem ist? Zum Zeitpunkt der Threaderstelleung stelle sich mir die Frage ob es überhaupt ein Bildschirmschoner Problem ist, denn die Eigenschaften von Anzeige produzierten immer frische Prozesse, auch bei einem leeren Konfigurationsfenster. Und das konnte nicht sein. Erst später stellte ich fest, daß der Konfigurationsfenster im gleichen Moment geschlossen wurde wie ein neuer Preview Prozess erstellt wurde. Nur erkannte ich es damals noch nicht. Für mich sah es so aus als ob das Konfigurationsfenster das mit Close beendet wurde, wobei dieses Fenster in dem Moment das Mainfenster war, nicht geschlossen werden konnte.

Für mich war also zu dem Zeitpunkt dieses Problem ein Problem was nicht nicht sein konnte. Es konnte nicht sein, daß sowohl Preview, wie Konfiguration und Vorschau Prozesse erstellten, denn alle waren unterschiedlich programmiert. Er war zu dem Zeitpunkt also ein unerklärliches Etwas was ich eigentlich nicht beschreiben konnte.

Bornemaxx 28. Nov 2007 18:19

Re: Eine Frage die nur die Glaskugel beantworten werden kann
 
Zitat:

Zitat von Popov
...
Allerdings gibt es tatsächlich eine Möglichkeit einen BS Namen unabhängig dem Datei Namen zu setzten. Nur ist mir der nicht bekannt. Auch wenn ich schon seit Jahren dran suche.

.. genau danach habe ich heute gesucht, als ich auf diesen Thread gestoßen bin. Da hier leider nichts zu finden war, habe ich mir mal die Original-BS genauer angesehen. Und die Lösung gefunden ! :bounce2:
In der String-Table gibt es einen Eintrag mit der Nummer 1, der enthält den String, der als Name angezeigt wird.
Erzeugen kann man den mittels einer rc/res-Datei, die man mit einbindet. In der rc-Datei muß stehen:
Code:
STRINGTABLE
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
{
1,    "Mein Bildschirmschoner"
}
Habe es getestet unter XP und 98, da funktioniert es. unter NT und 95 scheint es nicht zu klappen, auch nicht mit der $D Direktive.
Viel Spaß beim Testen.

Viele Grüße

Mirko
(ganz neu hier, siehe Beitragszahl.)

hathor 28. Nov 2007 19:59

Re: Eine Frage die nur die Glaskugel beantworten werden kann
 
Zitat:

Zitat von Bornemaxx
...(ganz neu hier, siehe Beitragszahl.)

Oje, das fängt ja gut an!

Ich bekomme eine Fehlermeldung - bist Du sicher, dass das was mit Delphi (oder mit Reactos???) zu tun hat?

[DCC Fehler] E2161 RLINK32: Unsupported 16bit resource in file "F:\Borland Studio Projects\31-LeererBildschirmschoner\test.res"

Bornemaxx 28. Nov 2007 20:15

Re: Probleme mit Bildschirmschonervorschau
 
Hallo hathor,
Ich hoffe, Deine Antwort bezieht sich auf meinen Tip zur Anzeige des Bildschirmschoner-Namens.

Also von Anfang an: Ich nutze Delphi 5.
Habe eine Datei namens string1.rc erstellt, diese enthält die o.g. Zeilen. Diese dann in der Eingabeaufforderung übersetzt mittels "brcc32 -r string1.rc" (brcc32 steht im Delphi-Verzeichnis unter \bin, sollte aber durch die Pfadangaben überall gefunden werden). Dadurch erhalte ich eine Datei namens string.res und die binde ich ein per {$R string1.res}. Damit funktioniert es bei mir jedenfalls.
Ich drück Dir die Daumen.

Gruß Mirko

Popov 28. Nov 2007 20:16

Re: Eine Frage die nur die Glaskugel beantworten werden kann
 
Zitat:

Zitat von Bornemaxx
Code:
STRINGTABLE
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
{
1,    "Mein Bildschirmschoner"
}
Habe es getestet unter XP und 98, da funktioniert es. unter NT und 95 scheint es nicht zu klappen, auch nicht mit der $D Direktive.
Viel Spaß beim Testen.

Getestet habe ich dein Tipp noch nicht, aber so weit war ich eigentlich auch schon. Ich werde deinen Tipp nochmal testen, aber das mit der Ressource habe ich auch schon in 20 verschiedenen Varianten ausprobiert. Neu ist das für mich also nicht. Aber ich werde es trotzdem testen.

Popov 28. Nov 2007 20:28

Re: Probleme mit Bildschirmschonervorschau
 
Ich hab es ausprobiert, funktionieren tut es aber nicht. Ich hab es mit Delphi 3 und Delphi 7 ausprobiert.

Erstellt habe ich die Datei STRING.RC

Delphi-Quellcode:
STRINGTABLE
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
{
1,   "Mein Bildschirmschoner"
}
dann die Datei RESBUILD.BAT

Delphi-Quellcode:
@brcc32 STRING.RC
Ergebnis war die STRING.RES

Diese hab ich in der Projektdatei eingebunden

Delphi-Quellcode:
{$R STRING.RES}
Hat nichts gebracht.

Aber trotzdem danke.

Bornemaxx 28. Nov 2007 20:45

Re: Probleme mit Bildschirmschonervorschau
 
Liste der Anhänge anzeigen (Anzahl: 1)
@ Popov
Schade, ich gehe davon aus, dass die *.res auch im Projektverzeichnis liegt. Aber mit einem Resourcen-Editor kann man sich das anzeigen lassen. Im Anhang ein Bild wie es bei mir aussieht.

Gruß Mirko


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:06 Uhr.
Seite 2 von 4     12 34      

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