FileForums

FileForums (https://fileforums.com/index.php)
-   Conversion Tutorials (https://fileforums.com/forumdisplay.php?f=55)
-   -   [HELP] Dynamic ComboBox Add Items (https://fileforums.com/showthread.php?t=97211)

JRD! 22-09-2015 19:51

[HELP] Dynamic ComboBox Add Items
 
I use a function "EnumDisplaySettings" which lists the resolutions supported by the display, this function is capable of the resolutions listed in a combo box with the style "csDropDown" I want fix the ComboBox style on "csOwnerDrawVariable", the challenge is to create an index for the value that will be read in an xml file, we do not just display text with the style "csOwnerDrawVariable" we are obliged to him indicated the corresponding ItemIndex, I can not find solution to this issue.

Sorry for my bad english, i use a translator...

CheckResDynamic:

Code:

#DEFINE NAME="CheckResDynamic"
[Setup]
AppName={#NAME}
AppVersion=1.0
CreateAppDir=false
OutputDir=.
OutputBaseFilename={#NAME}

[#Code]
#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif
const
  CCHFORMNAME = 32;
  CCHDEVICENAME = 32;
  SM_CXSCREEN = 0;
  SM_CYSCREEN = 1;
type
  TDeviceMode = record
    dmDeviceName: array[0..CCHDEVICENAME - 1] of Char;
    dmSpecVersion: Word;
    dmDriverVersion: Word;
    dmSize: Word;
    dmDriverExtra: Word;
    dmFields: DWORD;
    dmOrientation: Smallint;
    dmPaperSize: Smallint;
    dmPaperLength: Smallint;
    dmPaperWidth: Smallint;
    dmScale: Smallint;
    dmCopies: Smallint;
    dmDefaultSource: Smallint;
    dmPrintQuality: Smallint;
    dmColor: Smallint;
    dmDuplex: Smallint;
    dmYResolution: Smallint;
    dmTTOption: Smallint;
    dmCollate: Smallint;
    dmFormName: array[0..CCHFORMNAME - 1] of Char;
    dmLogPixels: Word;
    dmBitsPerPel: DWORD;
    dmPelsWidth: DWORD;
    dmPelsHeight: DWORD;
    dmDisplayFlags: DWORD;
    dmDisplayFrequency: DWORD;
    dmICMMethod: DWORD;
    dmICMIntent: DWORD;
    dmMediaType: DWORD;
    dmDitherType: DWORD;
    dmICCManufacturer: DWORD;
    dmICCModel: DWORD;
    dmPanningWidth: DWORD;
    dmPanningHeight: DWORD;
  end;
  TDeviceFilter = record
    Width: DWORD;
    Height: DWORD;
  end;

var
  ModeIndex: DWORD;
  ModeExists: Boolean;
  FilterIndex: Integer;
  DisplayPage: TWizardPage;
  DisplayCombo: TNewComboBox;
  DisplayModes: array of TDeviceFilter;
  DisplaySettings: TDeviceMode;

function EnumDisplaySettings(lpszDeviceName: string; iModeNum: DWORD; var lpDevMode: TDeviceMode): BOOL;
 external 'EnumDisplaySettings{#AW}@user32.dll stdcall';

function GetSystemMetrics (nIndex: Integer): Integer;
 external '[email protected] stdcall setuponly';

function _MessageBoxW_(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
 external '[email protected] stdcall';

function SysMsgBox(const Caption, Message: String; const Flags: Integer): Integer;
begin
 Result := _MessageBoxW_(StrToInt(ExpandConstant('{wizardhwnd}')), Message, Caption, Flags);
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:=False;
  Cancel:=True;
end;

function LoadValueFromXML(const AFileName, APath: string): string;
var
        XMLNode: Variant;
        XMLDoc: Variant;
begin
        Log('Get Xml text node: ' + AFileName);
        Result := '';
        XMLDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
        try
                XMLDoc.async := False;
                XMLDoc.load(AFileName);
                if (XMLDoc.parseError.errorCode <> 0) then
      SysMsgBox('{#NAME}', 'Le fichier est introuvable.', MB_ICONWARNING) else begin
                        XMLDoc.setProperty('SelectionLanguage', 'XPath');
                        XMLNode := XMLDoc.selectSingleNode(APath);
                        Result := XMLNode.text;
                end;
        except
  SysMsgBox('{#NAME}', 'Une erreur est survenue!' + #13#10 + GetExceptionMessage, MB_ICONWARNING);
        end;
end;

function GetAttrValueFromXML(const AFileName, APath: string): string;
var
  XMLNode: Variant;
  XMLDoc: Variant;
begin
  Result := '';
  XMLDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
  try
    XMLDoc.async := False;
    XMLDoc.load(AFileName);
    if (XMLDoc.parseError.errorCode <> 0) then
      SysMsgBox('{#NAME}', 'Le fichier "settings.xml" est introuvable.', MB_ICONWARNING) else begin
      XMLDoc.setProperty('SelectionLanguage', 'XPath');
      XMLNode := XMLDoc.selectSingleNode(APath);
      Result := XMLNode.NodeValue;
    end;
  except
    SysMsgBox('{#NAME}', 'Une erreur est survenue!' + #13#10 + GetExceptionMessage, MB_ICONWARNING);
  end;
end;

procedure SaveValueToXML(const AFileName, APath, AValue: string);
var
        XMLNode: Variant;
        XMLDoc: Variant;
begin
        Log('Save Xml text node: ' + AFileName);
        XMLDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
        try
                XMLDoc.async := False;
                XMLDoc.load(AFileName);
                if (XMLDoc.parseError.errorCode <> 0) then
      SysMsgBox('{#NAME}', 'Le fichier "settings.xml" est introuvable.', MB_ICONWARNING) else begin
                        XMLDoc.setProperty('SelectionLanguage', 'XPath');
                        XMLNode := XMLDoc.selectSingleNode(APath);
                        XMLNode.text := AValue;
                        XMLDoc.save(AFileName);
                end;
        except
  SysMsgBox('{#NAME}', 'Une erreur est survenue!' + #13#10 + GetExceptionMessage, MB_ICONWARNING);
        end;
end;

procedure SaveAttributeValueToXML(const AFileName, APath, AAttribute, AValue: string);
var
        XMLNode: Variant;
        XMLDoc: Variant;
begin
        Log('Save Xml attr: ' + AFileName);
        XMLDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
        try
                XMLDoc.async := False;
                XMLDoc.load(AFileName);
                if (XMLDoc.parseError.errorCode <> 0) then
      SysMsgBox('{#NAME}', 'Le fichier "settings.xml" est introuvable.', MB_ICONWARNING) else begin
                        XMLDoc.setProperty('SelectionLanguage', 'XPath');
                        XMLNode := XMLDoc.selectSingleNode(APath);
                        XMLNode.setAttribute(AAttribute, AValue);
                        XMLDoc.save(AFileName);
                end;
        except
  SysMsgBox('{#NAME}', 'Une erreur est survenue!' + #13#10 + GetExceptionMessage, MB_ICONWARNING);
        end;
end;

procedure DisplayComboOnChange(Sender: TObject);
var
  ModeIndex: DWORD;
  ModeExists: Boolean;
  FilterIndex,ProgressBarPos,ProgressBarMax: Integer;
  DisplayModes: array of TDeviceFilter;
  DisplaySettings: TDeviceMode;
  XMLFile: string;
begin
    XMLFile := ExpandConstant('{src}\settings.xml');
    ModeIndex := 0;
    while EnumDisplaySettings('', ModeIndex, DisplaySettings) do
    begin
      with DisplaySettings do
      begin
        Inc(ModeIndex);
        ModeExists := False;
        for FilterIndex := 0 to GetArrayLength(DisplayModes) - 1 do
        begin
          if (DisplayModes[FilterIndex].Width = dmPelsWidth) and (DisplayModes[FilterIndex].Height = dmPelsHeight) then begin
            ModeExists := True;
            Break;
          end;
        end;
        if not ModeExists then begin
          SetArrayLength(DisplayModes, GetArrayLength(DisplayModes) + 1);
          with DisplayModes[GetArrayLength(DisplayModes) - 1] do begin
          Width := dmPelsWidth;
          Height := dmPelsHeight;
          if DisplayCombo.Text = Format('%dx%d', [Width,Height]) then begin
            SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value',IntToStr(Width));
            SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value',IntToStr(Height));
          end;
        end;
      end;
    end;
  end;
end;

procedure InitializeWizard;
var
  xres,yres: integer;
  XMLFile,ResW,ResH: string;
  XMLDoc,NewNode,XMLNode,RootNode: Variant;
  AutoRunFormNotebook: TNewNotebook;
  AutoRunForm: TNewNotebookPage;
begin
  xres := GetSystemMetrics(SM_CXSCREEN);
  yres := GetSystemMetrics(SM_CYSCREEN);
  XMLFile := ExpandConstant('{src}\settings.xml');
  XMLDoc := CreateOleObject('MSXML2.DOMDocument');
  XMLDoc.async := False;
  XMLDoc.resolveExternals := False;
  XMLDoc.load(XMLFile);
  XMLNode := XMLDoc.selectSingleNode('//Settings/FirstLaunch');
  if ((XMLNode as IDispatch) = nil) then begin
  NewNode := XMLDoc.createElement('FirstLaunch');
  RootNode := XMLDoc.documentElement;
  RootNode.appendChild(NewNode);
  RootNode.lastChild.text := '0';
  XMLDoc.Save(XMLFile);
  SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value',IntToStr(xres));
  SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value',IntToStr(yres));
  end;

  with WizardForm do
  begin
    BorderStyle := bsDialog;
    Position := poScreenCenter;
    AutoScroll := False;
    ClientWidth := ScaleX(220);
    ClientHeight := ScaleY(50);
    Caption:='{#NAME}';
  end;

  AutoRunFormNotebook := TNewNotebook.Create(WizardForm);
  with AutoRunFormNotebook do
  begin
    Parent := WizardForm;
    Left := ScaleX(0);
    Top := ScaleY(0);
    Width := ScaleX(220);
    Height := ScaleY(50);
    Align := alClient;
  end;

  AutoRunForm := TNewNotebookPage.Create(WizardForm);
  with AutoRunForm do
  begin
    Notebook := AutoRunFormNotebook;
  end;

  ResW:=GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value');
  ResH:=GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value');
  DisplayCombo := TNewComboBox.Create(WizardForm);
  with DisplayCombo do
  begin
    Parent := AutoRunFormNotebook;
    Left:=10;
    Top:=15;
    Width := 200;
    Text := ResW+'x'+ResH;
    OnChange:=@DisplayComboOnChange;
    //Style:=csOwnerDrawVariable;
  end;

  ModeIndex := 0;
  while EnumDisplaySettings('', ModeIndex, DisplaySettings) do
  begin
    with DisplaySettings do
    begin
      Inc(ModeIndex);
      ModeExists := False;
      for FilterIndex := 0 to GetArrayLength(DisplayModes) - 1 do
      begin
        if (DisplayModes[FilterIndex].Width = dmPelsWidth) and
          (DisplayModes[FilterIndex].Height = dmPelsHeight)then
        begin
          ModeExists := True;
          Break;
        end;
      end;

      if not ModeExists then
      begin
        SetArrayLength(DisplayModes, GetArrayLength(DisplayModes) + 1);
        with DisplayModes[GetArrayLength(DisplayModes) - 1] do
        begin
          Width := dmPelsWidth;
          Height := dmPelsHeight;
          DisplayCombo.Items.Add(Format('%dx%d', [Width,Height]));
        end;
      end;
    end;
  end;
end;

This code work but not listed all supported resolution by screen, just one list of resolution...

CheckResNotDynamic:

Code:

#DEFINE NAME="CheckResNotDynamic"
[Setup]
AppName={#NAME}
AppVersion=1.0
CreateAppDir=false
OutputDir=.
OutputBaseFilename={#NAME}

[#Code]
const
  SM_CXSCREEN = 0;
  SM_CYSCREEN = 1;

var
  DisplayCombo: TNewComboBox;

function GetSystemMetrics (nIndex: Integer): Integer;
 external '[email protected] stdcall setuponly';
function _MessageBoxW_(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
 external '[email protected] stdcall';

function SysMsgBox(const Caption, Message: String; const Flags: Integer): Integer;
begin
 Result := _MessageBoxW_(StrToInt(ExpandConstant('{wizardhwnd}')), Message, Caption, Flags);
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:=False;
  Cancel:=True;
end;

function LoadValueFromXML(const AFileName, APath: string): string;
var
        XMLNode: Variant;
        XMLDoc: Variant;
begin
        Log('Get Xml text node: ' + AFileName);
        Result := '';
        XMLDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
        try
                XMLDoc.async := False;
                XMLDoc.load(AFileName);
                if (XMLDoc.parseError.errorCode <> 0) then
      SysMsgBox('{#NAME}', 'Le fichier est introuvable.', MB_ICONWARNING) else begin
                        XMLDoc.setProperty('SelectionLanguage', 'XPath');
                        XMLNode := XMLDoc.selectSingleNode(APath);
                        Result := XMLNode.text;
                end;
        except
  SysMsgBox('{#NAME}', 'Une erreur est survenue!' + #13#10 + GetExceptionMessage, MB_ICONWARNING);
        end;
end;

function GetAttrValueFromXML(const AFileName, APath: string): string;
var
  XMLNode: Variant;
  XMLDoc: Variant;
begin
  Result := '';
  XMLDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
  try
    XMLDoc.async := False;
    XMLDoc.load(AFileName);
    if (XMLDoc.parseError.errorCode <> 0) then
      SysMsgBox('{#NAME}', 'Le fichier "settings.xml" est introuvable.', MB_ICONWARNING) else begin
      XMLDoc.setProperty('SelectionLanguage', 'XPath');
      XMLNode := XMLDoc.selectSingleNode(APath);
      Result := XMLNode.NodeValue;
    end;
  except
    SysMsgBox('{#NAME}', 'Une erreur est survenue!' + #13#10 + GetExceptionMessage, MB_ICONWARNING);
  end;
end;

procedure SaveValueToXML(const AFileName, APath, AValue: string);
var
        XMLNode: Variant;
        XMLDoc: Variant;
begin
        Log('Save Xml text node: ' + AFileName);
        XMLDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
        try
                XMLDoc.async := False;
                XMLDoc.load(AFileName);
                if (XMLDoc.parseError.errorCode <> 0) then
      SysMsgBox('{#NAME}', 'Le fichier "settings.xml" est introuvable.', MB_ICONWARNING) else begin
                        XMLDoc.setProperty('SelectionLanguage', 'XPath');
                        XMLNode := XMLDoc.selectSingleNode(APath);
                        XMLNode.text := AValue;
                        XMLDoc.save(AFileName);
                end;
        except
  SysMsgBox('{#NAME}', 'Une erreur est survenue!' + #13#10 + GetExceptionMessage, MB_ICONWARNING);
        end;
end;

procedure SaveAttributeValueToXML(const AFileName, APath, AAttribute, AValue: string);
var
        XMLNode: Variant;
        XMLDoc: Variant;
begin
        Log('Save Xml attr: ' + AFileName);
        XMLDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
        try
                XMLDoc.async := False;
                XMLDoc.load(AFileName);
                if (XMLDoc.parseError.errorCode <> 0) then
      SysMsgBox('{#NAME}', 'Le fichier "settings.xml" est introuvable.', MB_ICONWARNING) else begin
                        XMLDoc.setProperty('SelectionLanguage', 'XPath');
                        XMLNode := XMLDoc.selectSingleNode(APath);
                        XMLNode.setAttribute(AAttribute, AValue);
                        XMLDoc.save(AFileName);
                end;
        except
  SysMsgBox('{#NAME}', 'Une erreur est survenue!' + #13#10 + GetExceptionMessage, MB_ICONWARNING);
        end;
end;

procedure DisplayComboOnChange(Sender: TObject);
var
  XMLFile: string;
begin
  XMLFile := ExpandConstant('{src}\settings.xml');
  case DisplayCombo.ItemIndex of
    0:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','800');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','600'); end;
    1:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1024');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','768'); end;
    2:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1152');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','864'); end;
    3:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1280');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','720'); end;
    4:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1280');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','768'); end;
    5:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1280');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','800'); end;
    6:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1280');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','960'); end;
    7:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1280');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','1024'); end;
    8:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1360');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','768'); end;
    9:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1366');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','768'); end;
    10:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1600');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','900'); end;
    11:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1600');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','1024'); end;
    12:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1600');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','1200'); end;
    13:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1680');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','1050'); end;
    14:begin SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value','1920');
    SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value','1080'); end;
  end;
end;

procedure InitializeWizard;
var
  xres,yres: integer;
  XMLFile,ResW,ResH: string;
  XMLDoc,NewNode,XMLNode,RootNode: Variant;
  AutoRunFormNotebook: TNewNotebook;
  AutoRunForm: TNewNotebookPage;
begin
  xres := GetSystemMetrics(SM_CXSCREEN);
  yres := GetSystemMetrics(SM_CYSCREEN);
  XMLFile := ExpandConstant('{src}\settings.xml');
  XMLDoc := CreateOleObject('MSXML2.DOMDocument');
  XMLDoc.async := False;
  XMLDoc.resolveExternals := False;
  XMLDoc.load(XMLFile);
  XMLNode := XMLDoc.selectSingleNode('//Settings/FirstLaunch');
  if ((XMLNode as IDispatch) = nil) then begin
  NewNode := XMLDoc.createElement('FirstLaunch');
  RootNode := XMLDoc.documentElement;
  RootNode.appendChild(NewNode);
  RootNode.lastChild.text := '0';
  XMLDoc.Save(XMLFile);
  SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value',IntToStr(xres));
  SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value',IntToStr(yres));
  end;

  with WizardForm do
  begin
    BorderStyle := bsDialog;
    Position := poScreenCenter;
    AutoScroll := False;
    ClientWidth := ScaleX(220);
    ClientHeight := ScaleY(50);
    Caption:='{#NAME}';
  end;

  AutoRunFormNotebook := TNewNotebook.Create(WizardForm);
  with AutoRunFormNotebook do
  begin
    Parent := WizardForm;
    Left := ScaleX(0);
    Top := ScaleY(0);
    Width := ScaleX(220);
    Height := ScaleY(50);
    Align := alClient;
  end;

  AutoRunForm := TNewNotebookPage.Create(WizardForm);
  with AutoRunForm do
  begin
    Notebook := AutoRunFormNotebook;
  end;

  DisplayCombo := TNewComboBox.Create(WizardForm);
  with DisplayCombo do begin
  Parent := AutoRunFormNotebook;
  Left:=10;
  Top:=15;
  Width := 200;
  Style:=csOwnerDrawVariable;
  Items.Add('800x600');
  Items.Add('1024x768');
  Items.Add('1152x864');
  Items.Add('1280x720');
  Items.Add('1280x768');
  Items.Add('1280x800');
  Items.Add('1280x960');
  Items.Add('1280x1024');
  Items.Add('1360x768');
  Items.Add('1366x768');
  Items.Add('1600x900');
  Items.Add('1600x1024');
  Items.Add('1600x1200');
  Items.Add('1680x1050');
  Items.Add('1920x1080');
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '800') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '600') then ItemIndex := 0;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1024') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '768') then ItemIndex := 1;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1152') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '864') then ItemIndex := 2;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1280') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '720') then ItemIndex := 3;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1280') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '768') then ItemIndex := 4;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1280') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '800') then ItemIndex := 5;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1280') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '960') then ItemIndex := 6;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1280') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '1024') then ItemIndex := 7;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1360') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '768') then ItemIndex := 8;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1366') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '768') then ItemIndex := 9;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1600') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '900') then ItemIndex := 10;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1600') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '1024') then ItemIndex := 11;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1600') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '1200') then ItemIndex := 12;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1600') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '1050') then ItemIndex := 13;
  if (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value') = '1920') and
 (GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value') = '1080') then ItemIndex := 14;
  OnChange:=@DisplayComboOnChange;
  end;
end;

I want listed all resolutions supported by the monitor and listed in order, not just a list, we have based on the "EnumDisplaySettings" then came to order the ItemIndex...

Code:


  ModeIndex := 0;
  while EnumDisplaySettings('', ModeIndex, DisplaySettings) do
  begin
    with DisplaySettings do
    begin
      Inc(ModeIndex);
      ModeExists := False;
      for FilterIndex := 0 to GetArrayLength(DisplayModes) - 1 do
      begin
        if (DisplayModes[FilterIndex].Width = dmPelsWidth) and
          (DisplayModes[FilterIndex].Height = dmPelsHeight)then
        begin
          ModeExists := True;
          Break;
        end;
      end;

      if not ModeExists then
      begin
        SetArrayLength(DisplayModes, GetArrayLength(DisplayModes) + 1);
        with DisplayModes[GetArrayLength(DisplayModes) - 1] do
        begin
          Width := dmPelsWidth;
          Height := dmPelsHeight;
          DisplayCombo.Items.Add(Format('%dx%d', [Width,Height]));
          SaveStringToFile(ExpandConstant('{userdocs}\Rockstar Games\GTA V\EnumDisplay.txt'),
            Format('%dx%d'+#13#10, [Width,Height]), True);

        end;
      end;
    end;
  end;

How to integrate the list in the ComboBox?

Someone an idea? :confused:

May be

Code:

  ModeIndex := 0;
  while EnumDisplaySettings('', ModeIndex, DisplaySettings) do
  begin
    with DisplaySettings do
    begin
      Inc(ModeIndex);
      ModeExists := False;
      for FilterIndex := 0 to GetArrayLength(DisplayModes) - 1 do
      begin
        if (DisplayModes[FilterIndex].Width = dmPelsWidth) and
          (DisplayModes[FilterIndex].Height = dmPelsHeight)then
        begin
          ModeExists := True;
          Break;
        end;
      end;

      if not ModeExists then
      begin
        SetArrayLength(DisplayModes, GetArrayLength(DisplayModes) + 1);
        with DisplayModes[GetArrayLength(DisplayModes) - 1] do
        begin
          Width := dmPelsWidth;
          Height := dmPelsHeight;
          SaveStringToFile(ExpandConstant('{userdocs}\Rockstar Games\GTA V\EnumDisplay.txt'), Format('%dx%d'+#13#10, [Width,Height]), True);
          LoadStringFromFile(ExpandConstant('{userdocs}\Rockstar Games\GTA V\EnumDisplay.txt'), ANSIStr);
          UnicodeStr := String(ANSIStr);
          DisplayCombo.Items.Add(AnsiString(UnicodeStr));

          end;
        end;
    end;
  end;

List resolutions anyhow...:o

Thanks for your help

RamiroCruzo 22-09-2015 21:47

Nice one

altef_4 27-09-2015 07:49

Code:

#DEFINE NAME="CheckResDynamic"
[Setup]
AppName={#NAME}
AppVersion=1.0
CreateAppDir=false
OutputDir=.
OutputBaseFilename={#NAME}

[Code]
#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif
const
  CCHFORMNAME = 32;
  CCHDEVICENAME = 32;
  SM_CXSCREEN = 0;
  SM_CYSCREEN = 1;
  MB_ICONWARNING = 2;
type
  TDeviceMode = record
    dmDeviceName: array[0..CCHDEVICENAME - 1] of Char;
    dmSpecVersion: Word;
    dmDriverVersion: Word;
    dmSize: Word;
    dmDriverExtra: Word;
    dmFields: DWORD;
    dmOrientation: Smallint;
    dmPaperSize: Smallint;
    dmPaperLength: Smallint;
    dmPaperWidth: Smallint;
    dmScale: Smallint;
    dmCopies: Smallint;
    dmDefaultSource: Smallint;
    dmPrintQuality: Smallint;
    dmColor: Smallint;
    dmDuplex: Smallint;
    dmYResolution: Smallint;
    dmTTOption: Smallint;
    dmCollate: Smallint;
    dmFormName: array[0..CCHFORMNAME - 1] of Char;
    dmLogPixels: Word;
    dmBitsPerPel: DWORD;
    dmPelsWidth: DWORD;
    dmPelsHeight: DWORD;
    dmDisplayFlags: DWORD;
    dmDisplayFrequency: DWORD;
    dmICMMethod: DWORD;
    dmICMIntent: DWORD;
    dmMediaType: DWORD;
    dmDitherType: DWORD;
    dmICCManufacturer: DWORD;
    dmICCModel: DWORD;
    dmPanningWidth: DWORD;
    dmPanningHeight: DWORD;
  end;
  TDeviceFilter = record
    Width: DWORD;
    Height: DWORD;
  end;

var
  ModeIndex: DWORD;
  ModeExists: Boolean;
  FilterIndex: Integer;
  DisplayPage: TWizardPage;
  DisplayCombo: TNewComboBox;
  DisplayModes: array of TDeviceFilter;
  DisplaySettings: TDeviceMode;

function EnumDisplaySettings(lpszDeviceName: string; iModeNum: DWORD; var lpDevMode: TDeviceMode): BOOL;
 external 'EnumDisplaySettings{#AW}@user32.dll stdcall';

function GetSystemMetrics (nIndex: Integer): Integer;
 external '[email protected] stdcall setuponly';

function _MessageBoxW_(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer;
 external '[email protected] stdcall';

function SysMsgBox(const Caption, Message: String; const Flags: Integer): Integer;
begin
 Result := _MessageBoxW_(StrToInt(ExpandConstant('{wizardhwnd}')), Message, Caption, Flags);
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:=False;
  Cancel:=True;
end;

function LoadValueFromXML(const AFileName, APath: string): string;
var
        XMLNode: Variant;
        XMLDoc: Variant;
begin
        Log('Get Xml text node: ' + AFileName);
        Result := '';
        XMLDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
        try
                XMLDoc.async := False;
                XMLDoc.load(AFileName);
                if (XMLDoc.parseError.errorCode <> 0) then
      SysMsgBox('{#NAME}', 'Le fichier est introuvable.', MB_ICONWARNING) else begin
                        XMLDoc.setProperty('SelectionLanguage', 'XPath');
                        XMLNode := XMLDoc.selectSingleNode(APath);
                        Result := XMLNode.text;
                end;
        except
  SysMsgBox('{#NAME}', 'Une erreur est survenue!' + #13#10 + GetExceptionMessage, MB_ICONWARNING);
        end;
end;

function GetAttrValueFromXML(const AFileName, APath: string): string;
var
  XMLNode: Variant;
  XMLDoc: Variant;
begin
  Result := '';
  XMLDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
  try
    XMLDoc.async := False;
    XMLDoc.load(AFileName);
    if (XMLDoc.parseError.errorCode <> 0) then
      SysMsgBox('{#NAME}', 'Le fichier "settings.xml" est introuvable.', MB_ICONWARNING) else begin
      XMLDoc.setProperty('SelectionLanguage', 'XPath');
      XMLNode := XMLDoc.selectSingleNode(APath);
      Result := XMLNode.NodeValue;
    end;
  except
    SysMsgBox('{#NAME}', 'Une erreur est survenue!' + #13#10 + GetExceptionMessage, MB_ICONWARNING);
  end;
end;

procedure SaveValueToXML(const AFileName, APath, AValue: string);
var
        XMLNode: Variant;
        XMLDoc: Variant;
begin
        Log('Save Xml text node: ' + AFileName);
        XMLDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
        try
                XMLDoc.async := False;
                XMLDoc.load(AFileName);
                if (XMLDoc.parseError.errorCode <> 0) then
      SysMsgBox('{#NAME}', 'Le fichier "settings.xml" est introuvable.', MB_ICONWARNING) else begin
                        XMLDoc.setProperty('SelectionLanguage', 'XPath');
                        XMLNode := XMLDoc.selectSingleNode(APath);
                        XMLNode.text := AValue;
                        XMLDoc.save(AFileName);
                end;
        except
  SysMsgBox('{#NAME}', 'Une erreur est survenue!' + #13#10 + GetExceptionMessage, MB_ICONWARNING);
        end;
end;

procedure SaveAttributeValueToXML(const AFileName, APath, AAttribute, AValue: string);
var
        XMLNode: Variant;
        XMLDoc: Variant;
begin
        Log('Save Xml attr: ' + AFileName);
        XMLDoc := CreateOleObject('Msxml2.DOMDocument.6.0');
        try
                XMLDoc.async := False;
                XMLDoc.load(AFileName);
                if (XMLDoc.parseError.errorCode <> 0) then
      SysMsgBox('{#NAME}', 'Le fichier "settings.xml" est introuvable.', MB_ICONWARNING) else begin
                        XMLDoc.setProperty('SelectionLanguage', 'XPath');
                        XMLNode := XMLDoc.selectSingleNode(APath);
                        XMLNode.setAttribute(AAttribute, AValue);
                        XMLDoc.save(AFileName);
                end;
        except
  SysMsgBox('{#NAME}', 'Une erreur est survenue!' + #13#10 + GetExceptionMessage, MB_ICONWARNING);
        end;
end;

procedure DisplayComboOnChange(Sender: TObject);
var
  ModeIndex: DWORD;
  ModeExists: Boolean;
  FilterIndex,ProgressBarPos,ProgressBarMax: Integer;
  DisplayModes: array of TDeviceFilter;
  DisplaySettings: TDeviceMode;
  XMLFile: string;
begin
    XMLFile := ExpandConstant('{src}\settings.xml');
    ModeIndex := 0;
    while EnumDisplaySettings('', ModeIndex, DisplaySettings) do
    begin
      with DisplaySettings do
      begin
        Inc(ModeIndex);
        ModeExists := False;
        for FilterIndex := 0 to GetArrayLength(DisplayModes) - 1 do
        begin
          if (DisplayModes[FilterIndex].Width = dmPelsWidth) and (DisplayModes[FilterIndex].Height = dmPelsHeight) then begin
            ModeExists := True;
            Break;
          end;
        end;
        if not ModeExists then begin
          SetArrayLength(DisplayModes, GetArrayLength(DisplayModes) + 1);
          with DisplayModes[GetArrayLength(DisplayModes) - 1] do begin
          Width := dmPelsWidth;
          Height := dmPelsHeight;
          if DisplayCombo.Text = Format('%dx%d', [Width,Height]) then begin
            SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value',IntToStr(Width));
            SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value',IntToStr(Height));
          end;
        end;
      end;
    end;
  end;
end;

procedure InitializeWizard;
var
  xres,yres: integer;
  XMLFile,ResW,ResH: string;
  XMLDoc,NewNode,XMLNode,RootNode: Variant;
  AutoRunFormNotebook: TNewNotebook;
  AutoRunForm: TNewNotebookPage;
begin
  xres := GetSystemMetrics(SM_CXSCREEN);
  yres := GetSystemMetrics(SM_CYSCREEN);
  XMLFile := ExpandConstant('{src}\settings.xml');
  XMLDoc := CreateOleObject('MSXML2.DOMDocument');
  XMLDoc.async := False;
  XMLDoc.resolveExternals := False;
  XMLDoc.load(XMLFile);
  XMLNode := XMLDoc.selectSingleNode('//Settings/FirstLaunch');
  {if ((XMLNode as IDispatch) = nil) then begin
  NewNode := XMLDoc.createElement('FirstLaunch');
  RootNode := XMLDoc.documentElement;
  RootNode.appendChild(NewNode);
  RootNode.lastChild.text := '0';
  XMLDoc.Save(XMLFile);
  SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenWidth','value',IntToStr(xres));
  SaveAttributeValueToXML(XMLFile, '//Settings/video/ScreenHeight','value',IntToStr(yres));
  end;}

  with WizardForm do
  begin
    BorderStyle := bsDialog;
    Position := poScreenCenter;
    AutoScroll := False;
    ClientWidth := ScaleX(220);
    ClientHeight := ScaleY(50);
    Caption:='{#NAME}';
  end;

  AutoRunFormNotebook := TNewNotebook.Create(WizardForm);
  with AutoRunFormNotebook do
  begin
    Parent := WizardForm;
    Left := ScaleX(0);
    Top := ScaleY(0);
    Width := ScaleX(220);
    Height := ScaleY(50);
    Align := alClient;
  end;

  AutoRunForm := TNewNotebookPage.Create(WizardForm);
  with AutoRunForm do
  begin
    Notebook := AutoRunFormNotebook;
  end;

  ResW:=GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenWidth/@value');
  ResH:=GetAttrValueFromXML(XMLFile,'//Settings/video/ScreenHeight/@value');
  DisplayCombo := TNewComboBox.Create(WizardForm);
  with DisplayCombo do
  begin
    Parent := AutoRunFormNotebook;
    Left:=10;
    Top:=15;
    Width := 200;
    Text := ResW+'x'+ResH;
    OnChange:=@DisplayComboOnChange;
    Style:=csOwnerDrawVariable;
  end;

  ModeIndex := 0;
  while EnumDisplaySettings('', ModeIndex, DisplaySettings) do
  begin
    with DisplaySettings do
    begin
      Inc(ModeIndex);
      ModeExists := False;
      for FilterIndex := 0 to GetArrayLength(DisplayModes) - 1 do
      begin
        if (DisplayModes[FilterIndex].Width = dmPelsWidth) and
          (DisplayModes[FilterIndex].Height = dmPelsHeight)then
        begin
          ModeExists := True;
          Break;
        end;
      end;

      if not ModeExists then
      begin
        SetArrayLength(DisplayModes, GetArrayLength(DisplayModes) + 1);
        with DisplayModes[GetArrayLength(DisplayModes) - 1] do
        begin
          Width := dmPelsWidth;
          Height := dmPelsHeight;
          DisplayCombo.Items.Add(Format('%dx%d', [Width,Height]));
          if (Width = xres) and (Height = yres) then  DisplayCombo.ItemIndex:=DisplayCombo.Items.Count-1;
        end;
      end;
    end;
  end;
end;


JRD! 27-09-2015 12:46

1 Attachment(s)
Thank you altef_4 !

Code:

if (Width = xres) and (Height = yres) then  DisplayCombo.ItemIndex:=DisplayCombo.Items.Count-1;
Just a want check native resolution on first run, after check last resolution selected in the xml file...

Code:

if (Width = StrToInt(ResW)) and (Height = StrToInt(ResH)) then DisplayCombo.ItemIndex:=DisplayCombo.Items.Count-1;
You helped me a lot!

If that little interest someone:


All times are GMT -7. The time now is 05:45.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2026, vBulletin Solutions Inc.
FileForums @ https://fileforums.com