Валентин Озеров - Советы по Delphi. Версия 1.0.6

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.
Жалоба
Напишите нам, и мы в срочном порядке примем меры.
Описание книги "Советы по Delphi. Версия 1.0.6"
Описание и краткое содержание "Советы по Delphi. Версия 1.0.6" читать бесплатно онлайн.
for counter := 0 to Form.Componentcount do begin
if (components[counter] is TLED) then begin
LED[Component[counter].tag]:= TLED(components[counter]);
end
end;
Если вам нужен двухмерный массив, то для формирования индекса понадобится другая хитрость, например, хранение в свойстве Hint информации о времени создания компонентов.
Дублирование компонентов и их потомков во время выполнения приложения
Приведенный ниже код содержит функцию DuplicateComponents, позволяющую проводить клонирование любых компонентов и их потомков во время выполнения приложения. Действия ее напоминают операцию копирования/вставки (copy/paste) во время разработки приложения. Новые компоненты при создании получают тех же родителей, владельцев (в случае применения контейнеров) и имена (естественно, несколько отличающихся), что и оригиналы. В данной функции есть вероятность багов, но я пока их не обнаружил. Ошибки и недочеты могут возникнуть из-за редко применяемых специфических методов, которые, вместе с тем, могут помочь программистам, столкнувшимися с аналогичными проблемами.
Данная функция может оказаться весьма полезной в случае наличия нескольких одинаковых областей на форме с необходимостью синхронизации изменений в течение некоторого промежутка времени. Процедура создания дубликата проста до безобразия: разместите на TPanel или на другом родительском компоненте необходимые элементы управления и сделайте: "newpanel := DuplicateComponents(designedpanel)".
uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, IniFiles, TypInfo, Debug;
type TUniqueReader = Class(TReader)
LastRead: TComponent;
procedure ComponentRead(Component: TComponent);
procedure SetNameUnique(Reader: TReader; Component: TComponent; var Name: string);
end;
implementation
procedure TUniqueReader.ComponentRead(Component: TComponent);
begin
LastRead:= Component;
end;
procedure TUniqueReader.SetNameUnique( // Задаем уникальное имя считываемому компоненту, например, "Panel2", если "Panel1" уже существует
Reader: TReader; Component: TComponent; // Считываемый компонент
var Name: string // Имя компонента для дальнейшей модификации
);
var
i: Integer;
tempname: string;
begin
i:= 0;
tempname:= Name;
while Component.Owner.FindComponent(Name) <> nil do begin
Inc(i);
Name:= Format('%s%d', [tempname, i]);
end;
end;
function DuplicateComponents(
AComponent: TComponent // исходный компонент
): TComponent; // возвращаемся к созданию нового компонента
procedure RegisterComponentClasses(AComponent: TComponent);
var i : integer;
begin
RegisterClass(TPersistentClass(AComponent.ClassType));
if AComponent is TWinControl then
if TWinControl(AComponent).ControlCount > 0 then
for i:= 0 to (TWinControl(AComponent).ControlCount-1) do RegisterComponentClasses(TWinControl(AComponent).Controls[i]);
end;
var
Stream: TMemoryStream;
UniqueReader: TUniqueReader;
Writer: TWriter;
begin
result:= nil;
UniqueReader:= nil;
Writer:= nil;
try
Stream:= TMemoryStream.Create;
RegisterComponentClasses(AComponent);
try
Write:= TWriter.Create(Stream, 4096);
Writer.Root:= AComponent.Owner;
Writer.WriteSignature;
Writer.WriteComponent(AComponent);
Writer.WriteListEnd;
finally
Writer.Free;
end;
Stream.Position:= 0;
try
UniqueReader:= TUniqueReader.Create(Stream, 4096); // создаем поток, перемещающий данные о компоненте в конструктор
UniqueReader.OnSetName:= UniqueReader.SetNameUnique;
UniqueReader.LastRead:= nil;
if AComponent is TWinControl then UniqueReader.ReadComponents( // считываем компоненты и суб-компоненты
TWinControl(AComponent).Owner, TWinControl(AComponent).Parent, UniqueReader.ComponentRead
)
else UniqueReader.ReadComponents( // читаем компоненты
AComponent.Owner, nil, UniqueReader.ComponentRead
);
result:= UniqueReader.LastRead;
finally
UniqueReader.Free;
end;
finally
Stream.Free;
end;
end;
События
Создание
Создание события во время выполнения приложения
на примере переопределения события в Memo:
memo.onchange:= memo1Change;
procedure TForm1.Memo1Change(Sender: TObject);
begin
panel1.caption:= 'Содержимое было изменено';
end;
Задержка выполнения
Задержка выполнения OnChange (Delphi 2)
В случае нажатия пользователем клавиши или изменении текущего элемента компонента ComboBox, вы обратите внимание на досадную задержку, возникающую при генерации события OnChange.
Так как "работа кипит", я хотел бы отреагировать на изменение ItemIndex несколько позднее, например, 100 миллисекунд спустя. Вот что у меня получилось. Созданный в Delphi2, код подходит также и для Delphi 1. На простой форме располагаем компоненты ComboBox и Label. Необходимым дополнением является вызов Application.ProcessMessages, позволяющий избежать замедления работы PC, когда очередь сообщений для формы пуста.
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
const
// Просто некоторая константа сообщения
PM_COMBOCHANGE = WM_USER + 8001;
// 500 миллисекунд
CWantedDelay = 500;
type TForm1 = class(TForm)
ComboBox1: TComboBox;
Label1: TLabel;
procedure ComboBox1Change(Sender: TObject);
private
procedure PMComboChange(var message : TMessage); message PM_COMBOCHANGE;
public
end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
PostMessage(Handle, PM_COMBOCHANGE, 0, 0);
end;
procedure TForm1.PMComboChange(var message : TMessage);
const
InProc: BOOLEAN = FALSE;
StartTick: LONGINT = 0;
begin
if InProc then begin
// Обновляем стартовое время задержки
StartTick:= GetTickCount;
end else begin
// Организация цикла
InProc:= TRUE;
// Инициализация стартового времени
StartTick:= GetTickCount;
// Ожидаем истечения стартового времени.
// Пока стартовое время не исчерпалось, позволяем операционной системе обрабатывать сообщения
while GetTickCount - StartTick < CWantedDelay do Application.ProcessMessages;
// Иллюстративное приращение счетчика, задающее некоторую реальную работу обработчику события OnChange
Label1.Caption:= IntToStr(StrToIntDef(Label1.Caption, 0) + 1);
// Завершение цикла
InProc:= FALSE;
end;
end;
end.
Миграция
Delphi3
Получение констант с определением ошибки функцией LoadStr
Возбуждение исключения и передача строковой константы ошибки из CONSTS.PAS (как это делалось в Delphi 1 и Delphi 2) в Delphi3 невозможна. Например:
raise SomeException.Create(LoadStr(SInsertLineError));
в Delphi3 теперь не работает. Я предлагаю использовать выражение
raise SomeException.Create({$IFNDEF VER100}LoadStr{$ENDIF}(SInsertLineError));
для вызова функции LoadStr "по нужде", устаревшей почему-то для этих целей в Delphi 3.
При попытке вызвать данную функцию в Delphi 3 (для получения типа ошибки, декларированной в модуле CONSTS(.PAS/.DCU)), мы получаем следующую ошибку компилятора: "Incompatible types: 'Integer' and 'String'"
Никакой информации по этому поводу я не нашел ни в фирменной документации, ни на Borland-сервере.
Ошибки
Delphi2
Ошибка в руководстве "Getting Started" на странице 42
Я только что установил Delphi 2.0, все прошло успешно и без единой ошибки, в процессе инсталляции коментарии и замечания не возникали.
Далее в Delphi 2.0 я открываю руководство "Getting Started" (Подготовка). Согласно странице 42, "Adding a display grid" (добавление и отображение сетки данных), добавляю на форму DBGrid, устанавливаю DataSource в GDSDataModule.CustomerSource, но данные в DBGrid не отображаются, хотя на странице 42 написано "Immediately, the data is displayed in the DBGrid" (данные немедленно будут отображены в DBGrid).
При запуске приложения тоже самое, данные не отображаются.
При вызове из меню Delphi "Database Explorer" все таблицы и их данные видятся без проблем.
Таблицу необходимо открыть. Установите свойство Active компонента Тable в True.
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!
Похожие книги на "Советы по Delphi. Версия 1.0.6"
Книги похожие на "Советы по Delphi. Версия 1.0.6" читать онлайн или скачать бесплатно полные версии.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Отзывы о "Валентин Озеров - Советы по Delphi. Версия 1.0.6"
Отзывы читателей о книге "Советы по Delphi. Версия 1.0.6", комментарии и мнения людей о произведении.