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


Авторские права

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

Здесь можно скачать бесплатно "Валентин Озеров - Советы по Delphi. Версия 1.0.6" в формате fb2, epub, txt, doc, pdf. Жанр: Программирование. Так же Вы можете читать книгу онлайн без регистрации и SMS на сайте LibFox.Ru (ЛибФокс) или прочесть описание и ознакомиться с отзывами.
Валентин Озеров - Советы по Delphi. Версия 1.0.6
Рейтинг:
Название:
Советы по Delphi. Версия 1.0.6
Издательство:
неизвестно
Год:
неизвестен
ISBN:
нет данных
Скачать:

99Пожалуйста дождитесь своей очереди, идёт подготовка вашей ссылки для скачивания...

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.

Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.

Как получить книгу?
Оплатили, но не знаете что делать дальше? Инструкция.

Описание книги "Советы по 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.


На Facebook В Твиттере В Instagram В Одноклассниках Мы Вконтакте
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!

Похожие книги на "Советы по Delphi. Версия 1.0.6"

Книги похожие на "Советы по Delphi. Версия 1.0.6" читать онлайн или скачать бесплатно полные версии.


Понравилась книга? Оставьте Ваш комментарий, поделитесь впечатлениями или расскажите друзьям

Все книги автора Валентин Озеров

Валентин Озеров - все книги автора в одном месте на сайте онлайн библиотеки LibFox.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

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

Отзывы читателей о книге "Советы по Delphi. Версия 1.0.6", комментарии и мнения людей о произведении.

А что Вы думаете о книге? Оставьте Ваш отзыв.