AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Probleme mit Bildschirmschonervorschau
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Bildschirmschonervorschau

Ein Thema von Popov · begonnen am 17. Nov 2007 · letzter Beitrag vom 26. Mai 2012
Antwort Antwort
Seite 2 von 3     12 3      
Popov
(Gast)

n/a Beiträge
 
#1

Re: Eine Frage die nur die Glaskugel beantworten werden kann

  Alt 17. Nov 2007, 23:09
Also ich hab noch ein wenig experimentiert und weiß jetzt etwas mehr. Entgegen dem was ich zuerst geschrieben habe, daß auch das Hauptfenster und Konfiguration-Fenster nicht beendet werden, stellte sich heraus, daß beide durchaus beendet werden. Allerdings wird nach dem Beenden eines der beiden Fenster in Eigenschaften von Anzeige der Screensaver erneut mit dem /P Parameter für das Previev gestartet. Es sah also nur so aus als ob das Hauptfenster oder Konfiguration-Fenster nicht beenden würde.

Der Schuldige Part ist also Preview.

Also hab ich alzaimar Empfehlung bis ins Extreme getrieben und hab alles bis auf das Preview Fenster gelöscht. Sogar die Projektdatei hat keinen Extracode.

Delphi-Quellcode:
uses
  SysUtils,
  Forms,
  uPreview in 'uPreview.pas{Preview};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TPreview, Preview);
  Application.Run;
end.
Das Previefenster hat nur noch eine Prozedur:

Delphi-Quellcode:
procedure TPreview.FormCreate(Sender: TObject);
var
  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;

  Windows.SetParent(Self.Handle, hWnd);
end;
Noch weniger geht nicht. Das Ganze wird korrekt im Preview Monitor angezeigt, nur nicht beendet. So in etwa, zumindest den zweiten Code, habe ich in jeder meiner BS. Keine Ahnung was hier anders ist.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Eine Frage die nur die Glaskugel beantworten werden kann

  Alt 18. Nov 2007, 07:50
hast du exakt den gleichen Quelltext auch bei den anderen Bildschirmschonern?
Meine aktuelle Vermutung: Dein Bildschirmschoner wird gestartet und später wird versucht, über das Handle welches beim Starten deines Bildschirms aktuell, das Programm zu beenden. Durch das umsetzen des BorderStyle kann es aber passieren dass, das Hauptfenster neu kreiert wird und somit dann ein anderes Handle hat. Funktioniert es wenn du den Borderstyle gleich in der DFM auf bsNone setzt?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Eine Frage die nur die Glaskugel beantworten werden kann

  Alt 18. Nov 2007, 08:31
Gut vermutet ...
Delphi-Quellcode:
procedure TCustomForm.SetBorderStyle(Value: TFormBorderStyle);
begin
  if FBorderStyle <> Value then
  begin
    FBorderStyle := Value;
    AutoScroll := FBorderStyle in [bsSizeable, bsSizeToolWin];
    if not (csDesigning in ComponentState) then RecreateWnd; // <<-- Möööööp
  end;
end;
Zitat von Popov:
Also hab ich alzaimar Empfehlung bis ins Extreme getrieben und hab alles bis auf das Preview Fenster gelöscht. Sogar die Projektdatei hat keinen Extracode.
...
Noch weniger geht nicht....
Hinterher ist man immer schlauer (ist nicht ironisch gemeint): Noch weniger geht doch. Denn man hätte auch den Code im Preview noch ausklammern können ... Ich hätte das vermutlich auch nicht auskommentiert, aber in Zukunft schon. (Klingt aber echt nach Klugscheisser, soll's aber nicht sein)

Ich denk mir immer (bildlich gesehen), das selbst ein Semikolon irgendeinen Schmonz verursachen kann. Man kann gar nicht so blöd denken, wie's dann kommt.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#4

Re: Eine Frage die nur die Glaskugel beantworten werden kann

  Alt 18. Nov 2007, 11:07
Betrifft Directive - So geht's:

Delphi-Quellcode:
program NurTest;

{$E scr} // Erstellt Programm mit .scr Endung

uses
  SysUtils,
  Forms,
  uMain in 'uMain.pas{Screensaver},
  uOptions in 'uOptions.pas{Options},
  uPreview in 'uPreview.pas{Preview};

{$R *.RES}
{$D SCRNSAVE : Test Screen Saver}
var
  Param1: String;
  Param1Chr: Char;
...
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.
Angehängte Grafiken
Dateityp: jpg directive_114.jpg (109,6 KB, 51x aufgerufen)
Angehängte Dateien
Dateityp: rar text_208.rar (306 Bytes, 18x aufgerufen)
  Mit Zitat antworten Zitat
18. Nov 2007, 11:15
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Multimedia" verschoben.
Delphi-Frage
Popov
(Gast)

n/a Beiträge
 
#6

Re: Eine Frage die nur die Glaskugel beantworten werden kann

  Alt 18. Nov 2007, 11:17
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.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

Re: Eine Frage die nur die Glaskugel beantworten werden kann

  Alt 18. Nov 2007, 11:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Eine Frage die nur die Glaskugel beantworten werden kann

  Alt 18. Nov 2007, 17:12
Warum hat der Threadtitel eigentlcih nichts mit dem Problem bzw. der Frage zu tun? Ich dachte eigentlich, dass du la´nge genug dabei bist, dass du wüsstest, wie man seinen Thread benennt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#9

Re: Eine Frage die nur die Glaskugel beantworten werden kann

  Alt 18. Nov 2007, 18:05
Zitat von Luckie:
Warum hat der Threadtitel eigentlcih nichts mit dem Problem bzw. der Frage zu tun? 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.
  Mit Zitat antworten Zitat
Bornemaxx

Registriert seit: 28. Nov 2007
9 Beiträge
 
#10

Re: Eine Frage die nur die Glaskugel beantworten werden kann

  Alt 28. Nov 2007, 19:19
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 !
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.)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 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