Delphi-PRAXiS
Seite 2 von 9     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Spectragram (https://www.delphipraxis.net/190309-spectragram.html)

EWeiss 22. Sep 2016 03:35

AW: Spectragram
 
Zitat:

Zitat von Luckie (Beitrag 1348377)
Was wurde bei mir deaktiviert und woran siehst du das? Ich hatte vorher mal ein paar Hintergründe durch probiert bevor ich eine MP3 auswählen wollte. Das Hintergrundbild wechseln funktioniert ohne Probleme.

Wenn du unsere ScreenShots vergleichst.
Fehlen bei dir unter Move Background drei Komponente.

2x Checkboxen und eine Trackbar.

Ich habe jetzt mal das hier addiert damit müsste es eigentlich funktionieren.

Delphi-Quellcode:
      if (GetOS = OsVista) or (GetOS = OsWindows7)
        and SkinEngine.IsCompositionEnabled then
      begin
Mit IsCompositionEnabled lade ich die dwmapi.dll..

Delphi-Quellcode:
function TSkinEngine.IsCompositionEnabled: boolean;
var
  DwmIsCompositionEnabled: function(pfEnabled: PBoolean): HRESULT; stdcall;
  hDwmapi: THandle;
  Enabled: BOOL;
begin
  Result := False;
  if (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 6) then
  begin
    hDwmapi := LoadLibrary('dwmapi.dll');
    if hDwmapi <> 0 then
      try
        DwmIsCompositionEnabled := GetProcAddress(hDwmapi, 'DwmIsCompositionEnabled');
        if Assigned(DwmIsCompositionEnabled) then
          Result := (DwmIsCompositionEnabled(@Enabled) = 0) and Enabled;
      finally
        FreeLibrary(hDwmapi);
      end;
  end;
end;
Ich denke das wird aber auch nicht ausreichen, denn was mache ich wenn die DLL nicht existiert dann kracht es auch.
Na ja oder auch nicht.. hDwmapi ist ja dann 0

Habe die geänderte DLL nochmals angehängt.
Vielleicht geht es ja damit.

gruss

Luckie 22. Sep 2016 03:40

AW: Spectragram
 
Die sind mir gar nicht aufgefallen.

Na ja, wenn du die DLL nicht laden kannst, dann musst du eben eine Fehlerbehandlung machen. Hinweis ausgeben und das Programm sauber beenden. Schön wäre natürlich ein Fallback, der ohne die DLL auskommt, so dass man das Programm zu mindest noch nutzen kann.

Luckie 22. Sep 2016 03:44

AW: Spectragram
 
Nope. Stürzt bei Klick auf den Button ab. AberMmoment mal. Am Skinengine kann es nicht liegen. Das Fenster wird ja geskinnt. Das funktioniert ja alles. Der Fehler mit dem Absturz kommt ja erst, wenn der Dateiöffnen Code durch den Klick aufgerufen wird. Da müsste der Fehler zu suchen sein. Hast du irgendwelche Pfade hard gecodet oder so?

EWeiss 22. Sep 2016 03:46

AW: Spectragram
 
Zitat:

Zitat von Luckie (Beitrag 1348379)
Die sind mir gar nicht aufgefallen.

Na ja, wenn du die DLL nicht laden kannst, dann musst du eben eine Fehlerbehandlung machen. Hinweis ausgeben und das Programm sauber beenden. Schön wäre natürlich ein Fallback, der ohne die DLL auskommt, so dass man das Programm zu mindest noch nutzen kann.

Werde ich machen..
Obwohl die Behandlung ja dadurch schon ausgelöst wird da die Abfrage False zurück liefert bei einem hDwmapi = 0

Den Fallback hätte ich dann mit der Abfrage von IsCompositionEnabled erstellt.
Bin mir jetzt nicht sicher ob wenn er die DLL nicht findet ein Exeption ausgelöst wird.
Oder ein Handle 0 ausreicht.

gruss

Luckie 22. Sep 2016 03:50

AW: Spectragram
 
LoadLibrary ist eine API Funktion und wird somit keine Exception auslösen. Der Rückgabewert ist ein Handle auf die DLL. Ist das Handle null, konnte sie nicht geladen werden.

EWeiss 22. Sep 2016 03:56

AW: Spectragram
 
Zitat:

Zitat von Luckie (Beitrag 1348380)
Nope. Stürzt bei Klick auf den Button ab. AberMmoment mal. Am Skinengine kann es nicht liegen. Das Fenster wird ja geskinnt. Das funktioniert ja alles. Der Fehler mit dem Absturz kommt ja erst, wenn der Dateiöffnen Code durch den Klick aufgerufen wird. Da müsste der Fehler zu suchen sein. Hast du irgendwelche Pfade hard gecodet oder so?

Der Dialog beinhaltet 3 Komponente

DriveList
DirList
FileList.

Bei der DriveList werden alle Festplatten addiert.
Delphi-Quellcode:
procedure TSkinDriveList.ListDrive(hList: hWnd);
var
  FileInfo: SHFILEINFO;
  AllDriveStrings: LongWord;
  Drives: array [0 .. 128] of Widechar;
  pDrive: PChar;
  IconCount: Integer;
begin
  IconCount := 1;
  DriveList := TStringList.Create;

  AllDriveStrings := GetLogicalDriveStrings(SizeOf(Drives), Drives);
  if AllDriveStrings = 0 then
    exit;

  if AllDriveStrings > SizeOf(Drives) then
    raise Exception.Create(SysErrorMessage(ERROR_OUTOFMEMORY));

  pDrive := Drives;
  while pDrive^ <> #0 do
  begin
    SHGetFileInfo(pDrive, FILE_ATTRIBUTE_NORMAL, FileInfo, SizeOf(FileInfo),
      SHGFI_DISPLAYNAME Or SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_ICON);
    if GetDriveType(pDrive) = DRIVE_NO_ROOT_DIR or DRIVE_FIXED then
    begin
      DriveList.Add(pDrive);
      ListAdd(hList, FileInfo.szDisplayName);
      SetLength(IconHandle, IconCount + 1);
      IconHandle[IconCount] := FileInfo.HIcon;
      inc(IconCount);
      inc(pDrive, 4);
    end
    else
      inc(pDrive, 4);

  end;

end;
also nichts festes.

Mit GetCurrentDirectory wird der letzte Pfad zugewiesen der verwendet wurde.
Wenn keiner existiert dann ist es der Pfad wo sich die Skins drin befinden.

Die Fileliste addiert die Dateien abhängig von dem Pfad der mit DirList gesetzt wurde.
Vorausgesetzt es finden sich MP3 Dateien darin.

Hard gecoded sollte da eigentlich nichts sein.

gruss

EWeiss 22. Sep 2016 03:57

AW: Spectragram
 
Zitat:

LoadLibrary ist eine API Funktion und wird somit keine Exception auslösen. Der Rückgabewert ist ein Handle auf die DLL. Ist das Handle null, konnte sie nicht geladen werden.
Dann ist das so denke ich mal OK.
Handle 0 sollte dann reichen.

Ich werde mal den Pfad der Anwendung ändern also auf eine andere Platte.
Mal sehen ob ich das reproduzieren kann.

EDIT:
Nop.. Kann den bin Ordner hinschieben wo ich will, Voraussetzung ist natürlich das ich vorher die INI Datei lösche
da hier ein fest eingeschriebener Pfad zum letzten Skin enthalten ist.
Danach startet alles wie es soll.

gruss

Luckie 22. Sep 2016 04:10

AW: Spectragram
 
Ein paar Dinge.

Delphi-Quellcode:
Drives: array [0 .. 128] of Widechar;
  pDrive: PChar;
Und dann machst du das:
Delphi-Quellcode:
pDrive := Drives
Du weißt einem PChar ein Array vom Typ WideChar zu. Keine Ahnung, ob das so in Ordnung ist. Kommt mir auf den ersten Blick komisch vor.

Delphi-Quellcode:
FileInfo: SHFILEINFO;
Würde ich vor der ersten Verwendung mit ZeroMemory "ausnullen". Schlägt nämlich SHGetFileInfo fehl, du prüfst es nicht, dann steht in FileInfo Schrott drin, mit dem du dann weiter arbeitest.

Wo wird die Stringliste wieder freigegeben? Besser: Der Aufrufer erzeugt die StringListe, übergibt sie als Parameter und gibt sie wieder frei. Dann kann man sie auch sauber in einem Ressourcenschutzblock verpacken. Erstellen und Freigeben in einer Routine macht es auch übersichtlicher.

EWeiss 22. Sep 2016 04:15

AW: Spectragram
 
Zitat:

Du weißt einem PChar ein Array vom Typ WideChar zu. Keine Ahnung, ob das so in Ordnung ist. Kommt mir auf den ersten Blick komisch vor.
Werde das nochmal prüfen ;)

Auch das mit dem ZeroMemory werde ich noch hinzufügen sind so kleine Dinge die man leicht übersieht im Eifer des Gefechtes.

gruss

Luckie 22. Sep 2016 04:24

AW: Spectragram
 
Rückgabewert von SHGetFileInfo prüfen!
Mit der StringListe nicht routineübergreifend arbeiten!

Ja, das ist so eine Sache. Eigentlich müsste der Code crashen, tut er aber bei Alice nicht, weil bei ihr die Belegung des Adressraums glücklicherweise passt und nichts wichtiges überschieben oder freigeben wird. Bei Bobby ist der Adressraum anders organsiert und da crasht es dann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:12 Uhr.
Seite 2 von 9     12 34     Letzte »    

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