Формы Delphi 7, привязки, не работающие в Vista

Поскольку ALC1200 и ALC888, кажется, очень похожи (см. этот немецкая Запись Wiki ), можно попробовать мое решение за Intel HDA ALC1200 на моем ноутбуке Acer Aspire 5920 G. После обновления до Ubuntu 12.04 Точный Ящер от 11,10 моих докладчиков продолжал производить звук при включении наушников. В 11,10 динамики были отключены звук автоматически, когда наушник был включен.

я зафиксировал его путем добавления строки к/etc/modprobe.d/alsa-base.conf:

options snd-hda-intel model=auto probe_mask=1

Теперь у меня есть намного больше опций/средств управления при выполнении alsamixer. Каждый - "Автобесшумный Режим". Установите это на "Включенный", если это не работает из поля.

stehpan

14
задан François 21 September 2009 в 22:59
поделиться

6 ответов

Возможно, это связано с проблемой «переполнение стека ядра Windows», которая возникает, если у вашего элемента управления много родителей. И если вы запустите его в 64-битной системе, переполнение стека ядра произойдет намного быстрее. (подробнее об этом здесь: http://news.jrsoftware.org/news/toolbar2000/msg07779.html )

CodeCentral от Embarcadero - это обходной путь для этой ошибки (который также скопирован почти 1: 1 в Delphi 2009 VCL): http://cc.embarcadero.com/Item/25646

12
ответ дан 1 December 2019 в 13:47
поделиться

Это могло быть из-за прозрачного фрейма, который показывает Vista. (Чтобы разные окна выглядели одинаково прозрачно.

Попробуйте использовать «Align» (alClient) вместо привязок. Поскольку вы используете все привязки, это имеет больше смысла.

2
ответ дан 1 December 2019 в 13:47
поделиться

До того, как в Delphi 4 были введены якоря, мы динамически изменяли размер компонентов для достижения того же эффекта. Вы можете легко перемещать / настраивать компоненты в событии формы onresize .

Установка для свойства формы doublebuffered значения true может уменьшить мерцание за счет буферизации метода paint . Я помню, что раньше нам тоже приходилось это реализовывать!

2
ответ дан 1 December 2019 в 13:47
поделиться

В качестве альтернативы предложенному мною динамическому изменению размера, основываясь на предложении Хеманта, я собрал рабочий код (см. Ниже). Просто создайте приложение форм VCL, перетащите на tpanel , которая не касается ни одного края формы (по умолчанию Align = alNone ), и замените Unit1 приведенным ниже кодом. Когда вы запустите его, вы увидите 4 желтых панели, окружающие ту, которая была добавлена ​​изначально, а центральная панель изменит размер в соответствии с формой (как если бы все привязки были истинными ).

unit Unit1;

interface

uses
  Windows, Classes, Controls, Forms, ExtCtrls, Graphics;

type
  TPanelPos = (ppLeft, ppRight, ppTop, ppBottom);
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    Panels : array[TPanelPos] of tpanel;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  PanelPos : TPanelPos;
begin
  for PanelPos := ppLeft to ppBottom do
  begin
    Panels[PanelPos] := tpanel.Create(Form1);
    Panels[PanelPos].Parent := Form1;
    Panels[PanelPos].Color := clYellow;
    case PanelPos of
     ppLeft :
       begin
         Panels[PanelPos].Align := alLeft;
         Panels[PanelPos].Width := Panel1.Left - 1;
       end;
     ppRight :
       begin
         Panels[PanelPos].Align := alRight;
         Panels[PanelPos].Width := Form1.Width - Panel1.Left - Panel1.Width;
       end;
     ppTop :
       begin
         Panels[PanelPos].Align := alTop;
         Panels[PanelPos].Height := Panel1.Top - 1;
       end;
     ppBottom :
       begin
         Panels[PanelPos].Align := alBottom;
         Panels[PanelPos].Height := Form1.Height - Panel1.Top - Panel1.Height;
       end;
    end;
    Panel1.Align := alClient;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  PanelPos : TPanelPos;
begin
  for PanelPos := ppLeft to ppBottom do
    Panels[PanelPos].Free;
end;

end.
1
ответ дан 1 December 2019 в 13:47
поделиться

Попробуйте запустить программу в режиме совместимости с XP в Vista. Программы, скомпилированные с помощью Delphi 7, могут не полностью поддерживать собственный режим Vista (на самом деле, неудивительно).

0
ответ дан 1 December 2019 в 13:47
поделиться

Похоже, это довольно старый вопрос, в любом случае, вот единственное решение этой проблемы во Вселенной: используйте старый метод определения размера Windows, используя API-захват WM_SIZE и WM_SIZING, это непреложный вопрос, который будет работать в каждой Windows, которую вы узнаю.

Конечно, это означает, что вы должны использовать в основном GetClientRect () для определения значений высоты и высоты, а затем изменять размеры элементов управления на основе этих значений, конечно, это может звучать как попытка зажечь космический корабль, но это лучший вариант.

В противном случае вы могли бы сделать что-то более практичное и быстрое в процедуре изменения размера, например:

Control1.Left := Control2.Left + (buttonControl.Width div 2) - (buttonControl3.Width div 2);
//for example widths
Control4.Width    := (Control.Width * 4) + (Control.Left * 8) + 54 ;

Я делаю такой код и работаю только во всех Windows, независимо от того, какая версия это будет.

Вам нужны только некоторые значения разрешения экрана, чтобы сделать что-то вроде этого:

iCXSCREEN := GetSystemMetrics(SM_CXSCREEN);
iCYSCREEN := GetSystemMetrics(SM_CYSCREEN);

    if ((iCXSCREEN = 1280) and (iCYSCREEN = 720)) or  ((iCXSCREEN = 1280) and (iCYSCREEN = 700)) or ((iCXSCREEN = 1280) and (iCYSCREEN = 600)) then begin

// blah blah

end;

Надежда помогает кому-то другому!

Ура!

0
ответ дан 1 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: