Рейтинговые книги
Читем онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 86 87 88 89 90 91 92 93 94 ... 123

Хорошей альтернативой может служить способ, при котором вы всегда определяете базовый компонент в качестве владельца всех других ваших «подкомпонентов» (при их создании). После этого будет работать поиск по свойству вашего базового компонента Components[]. 

CANVAS.TEXTWIDTH

Delphi 1 

Установить размер шрифта для панели можно следующим образом:

With StatusBar1.Panels[1] do begin

 Text := Edit1.Text;

 Canvas.Font.Size := StatusBar1.Font.Size;

 Width := Canvas.TextWidth(Text) + 10;

end;

Создание компонента

Delphi 1

…чтобы сгруппировать свойства наподобие Font, вам необходимо создать наследника (подкласс) TPersistent. Например:

TBoolList = class(TPersistent)

private

 FValue1: Boolean;

 FValue2: Boolean

published

 property Value1: Boolean read FValue1 write FValue1;

 property Value2: Boolean read FValue2 write FValue2;

end;

Затем, в вашем новом компоненте, для этого подкласса необходимо создать ivar. Чтобы все работало правильно, вам =необходимо= перекрыть конструктор.

TMyPanel = class(TCustomPanel)

private

 FBoolList: TBoolList;

public

 constructor Create(AOwner: TComponent); override;

published

 property BoolList: TBoolList read FBoolList write FBoolList;

end;

Затем добавьте следующий код в ваш конструктор:

constructor TMyPanel.Create(AOwner: TComponent);

begin

 inherited Create(AOwner);

 FBoolList := TBoolList.Create;

end;

Циклический опрос компонентов

Delphi 1

procedure TForm1.FormCreate(Sender: TObject);

var I : integer;

begin

 for I:= 0 to ComponentCount -1 do

  if (Components[I] IS TEdit) then

   (Components[I] AS TEdit).{Вашпараметр} := {ваше значение};

end;

Если вам необходимо идентифицировать конкретный набор edit-компонентов, поместите их на панели и сделайте примерно так:

procedure TForm1.FormCreate(Sender: TObject);

var I : integer;

begin

 with MyPanel do for I:= 0 to ControlCount -1 do

  if (Controls[I] IS TEdit) then

   (Controls[I] AS TEdit).{Вашпараметр} := {Ваше значение};

end;

В контексте примера, Edit1, Edit2 и т.д. есть то же самое, что и Edit[1], Edit[2]. Если вы хотите иметь доступ к серии элементов управления как к элементам массива, поместите их в TList.

MyArr := TList.Create;

MyArr.Add(Edit1);

MyArr.Add(Edit2);

For i := 0 To MyArr.count - 1 Do

 (MyArr.items[i] As TEdit).Enabled := False;

MyArr.Free;

procedure TForm1.FormCreate(Sender: TObject);

var I: Integer;

begin

 for I := 0 to ComponentCount -1 do

  if Components[I] is TEdit then

   TEdit(Components[I]).Whatever := 10;

end;

Для получения доступа используйте:

TButton(mylist.items[i]).property := sumpin;

или

TButton(mylist.items[i]).method;

Это хорошее решение для пакетной обработки компонентов или для получения доступа при линейном способе. Для решения вашей проблемы есть еще более легкое решение, которое требует предварительной работы в режиме проектирования. Установите свойство tag и получите преимущество в том, что все компоненты являются производными от TComponent и имеют это свойство.

Procedure TMyForm.MyButtonHandler(Sender: TObject);

Begin

 Case (Sender As TComponent).Tag Of

 1 : { что-то делаем }

 2 : { делаем что-то еще }

 .

 .

 End;

End;

Просто укажите в событии OnClick на MyButtonHandler для тех кнопок, в которых вы хотите использовать общий обработчик события. 

Мне надо добавить много строк в TListbox или в TCombobox или в TMemo или в TRichEdit, при этом сам объект постоянно мигает, перерисовываясь. Как избавиться от этого?

Двумя словами 

Nomadic скупо отвечает:

A: BeginUpdate/EndUpdate. 

Как мне создать компонент типа TField?

Delphi 1 

Наверное вы хотели создать класс, а не компонент? Класс является программируемым устройством, а не частью формы. Если вы поместили класс в модуль (скажем, myclass.pas) и вставили в вашу программу строку «uses myclass;», то воспользоваться им можно следующим образом:

type aninstance: tMyclass;

begin

 new (aninstance);

 {эквивалент aninstance := tMyclass.create; }

 …

 { здесь используем aninstance }

 …

 dispose(aninstance);

 { эквивалент aninstance.free; }

end;

Инкрементация строкового поля

Delphi 1

Свойства text элемента управления является строкой, в свою очередь являющейся массивом символом. Вы не можете осуществить преобразование символа в строку. Тем не менее, вы можете получить доступ ко всем символам строки через их индекс.

Попробуйте это:

var s : string;

begin

 s := RevField.text;

 s[1] := chr(ord(s[1]) + 1);

 RevField.text := s;

end;

Здесь кроются 2 проблемы:

1. Для увеличения значения вам необходимо извлекать символы из строки.

2. Хотя вы можете получить доступ к отдельным символам через выделение подстроки, данный метод не срабатывает у некоторых свойств, таких как, например, свойство TStringField Text.

Лучшим решением, по-видимому, будет написание специфической функции. Например, в случае, если revision-символ всегда является конечным символом строки, функция могла бы выглядеть следующим образом:

function IncrementTrailingVersionLetter(Str: string): string;

begin

 Str[Length(Str)] := Char(Ord(Str[Length(Str)]) + 1);

 IncrementTrailingVersionLetter := Str;

end;

и использовать ее следующим образом:

with RevField do Text := IncrementTrailingVersionLetter(Text); 

Классы 

TForm 

fsStayOnTop ~не наверху~

Delphi 1 

Тема: fsStayOnTop ~не наверху~

От: Philip Kapusta  74170,3550

Почему, если присвоить свойству FormStyle значение fsStayOnTop, форма так и не остается на самом верху?

Просто добавьте application.RestoreTopMosts в обработчик события формы OnPaint. Это ошибка.

Могли бы вы рассказать об этом чуть-чуть поподробнее? Delphi где-то в неправильном месте осуществляет вызов NormalizeTopMosts?

Borland говорит что это Windows, но это случается когда StayonTop-форма НЕ является главной формой. (Некоторые английские программисты чтобы получить эту отговорку потратили несколько сотен долларов, звоня в американскую службу помощи по телефону 1-800).

– Fred S. 

Без иконки в панели задач?

Если вы не хотите, чтобы ваше приложение имело иконку в панели задач, добавьте следующие строки в исходный код проекта:

Application.CreateHandle;

ShowWindow(Application.Handle, SW_HIDE);

Application.ShowMainForm := FALSE;

Да, чуть не забыл, есть еще одна вещь. При нормальном поведении TApplication создает дескриптор и показывает окно прежде, чем далее начнет что-то «происходить». Чтобы избежать этого, вам необходимо создать модуль, содержащий единственную строчку в секции initialization:

IsLibrary := True;

… и поместить этот модуль ПЕРВЫМ в .DPR-файле в списке используемых модулей. Этим мы «одурачиваем» TApplication, и оно думает что оно запущено из DLL, тем самым изменяя свое обычное поведение.

– Neil J. Rubenking

Передача переменных форме

Delphi 1

…поможете мне создать функцию, с помощью которой я передам переменные в TFormClass? Проблема в том, что MyDlg.Execute() не захотела компилироваться, поскольку, как сообщил мне компилятор, я не могу использовать MyDlg (определенный как: TForm).

Эта функция может выглядеть примерно так:

function ExecuteDialog(FormClass: TFormClass; var Data): Boolean;

Я могу вам дать еще один совет: сделать все ваши формы наследниками одного класса, в котором объявлены виртуальные методы SetData и GetData.

{ ----------------------- }

1 ... 86 87 88 89 90 91 92 93 94 ... 123
На этой странице вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров бесплатно.

Оставить комментарий