Aббpeвиaтypa OLE oбoзнaчaeт Objects Linked and Embedded
Перевод - "Пpиcoeдинeнныe И Bcтpoeнныe Oбъeкты",
или coкpaщeннo "ПИBO"
Выпуск № 30
Здравствуйте, уважаемые подписчики!
Сразу хочу извиниться за долгое отсутствие, но к сожалению на собственном примере убеждаюсь в правильности народной поговорки "Работа не волк, в лес не убежит". Вот и у меня так, работы навалилось не меряно, а она почему-то в лес не убегает. Т.е. действительно не волк, сидит у меня на голове и требует к себе внимания. :) В прошлом выпуске, были опубликованы ряд вопросов, на которые были присланы ряд ответов. Вот их то мы сейчас и будем посмотреть.
И так вопрос №1: У меня вопросик как mdi приложения навигацию между окнами сделать нападобие Opera AvantBrowseк (чтоб на toolabre висел список окон и каждой кнопке соответствовало одно окно)? Лелик. Отвечает Алексей Лосев:
1. Открываем стандартное приложение Windows: File->New->Application
2. Изменяем свойство FormStyle главной формы на fsMDIForm
3. Размещаем на форме главное меню добавив в него пункт "Открыть дочернее окно"
4. Размещаем на форме ControlBar с закладки Additional.
5. На только что созданный ControlBar помещаем TabControl со страницы Win32.
6. Добавляем в проект новую форму (Form2).
7. Для нее тоже изменяем свойство FormStyle но на fsMDIChild.
8. Убираем Form2 из списка форм создаваемых автоматически (Project->Options)
9. В модуле главной формы в блок var добавляем объявление массива вида:
var
Form1: TForm1;
arForms : array of TForm;
10. В блоке implementation подключаем второй модуль:
uses
unit2;
11. В качестве обработчика на нажатие пункта меню "Открыть дочернее окно" пишем:
Application.CreateForm(TForm2, Form2);
TabControl1.Tabs.Add(Form2.Caption);
SetLength(arForms, Length(arForms)+1);
arForms[Length(arForms)-1]:=Form2;
TabControl1.TabIndex:=Length(arForms)-1;
12. В качестве обработчика onChange компонента TabControl добавляем:
arForms[TabControl1.TabIndex].Show;
13. Для Form2 в блоке implementation подключаем первый модуль:
uses
unit1;
14. Для Form2 в качестве обработчика события onClose пишем код:
var
i, CurrentForm : integer;
begin
for i:=0 to Length(arForms)-1 do
if arForms[i]=Sender then
CurrentForm:=i;
for i:=CurrentForm to Length(arForms)-2 do
arForms[i]:=arForms[i+1];
SetLength(arForms, Length(arForms)-1);
Form1.TabControl1.Tabs.Delete(CurrentForm);
Action:=caFree;
end;
15. А дальше все что вам необходимо.
P.s. Хотя пример открывает только один тип дочерних окон, т.к. массив объявлен от базового класса TForm, для включения другой формы просто необходимо добавить еще один обработчик для ее создания аналогичный вышеуказанному (пункт 11), и настроить ее аналогично Form2 (пункты 7, 8, 13, 14). Все остальное менять не надо.
Помимо столь толкового описания, Алексей прислал и исходник, поэтому если у кого-то не ладиться, шлите мне письмо с темой: "mdi source", и я перешлю Вам исходник.
А вот ответ на этот вопрос присланный Корогод Вадимом:
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
form2.BringToFront
end;
И так для каждой формы!
Ну, а ежели ты хочешь, чтобы кнопки создавались сами и при нажатии открывалась нужная форма, делай так - MainForm:
type
TForm1 = class(TForm)
ToolBar1: TToolBar;
procedure TBringToFront(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2, Unit3;
{$R *.dfm}
procedure TForm1.TBringToFront(Sender: TObject);
var
I: Integer;
begin
for i := 0 to MDIChildCount-1 do
begin
if MDIChildren[I].Name=(Sender as TToolButton).Caption then
begin
MDIChildren[I].BringToFront;
Exit;
end;
end;
end;
А для каждой новой формы в OnCreate добавь код:
uses ..., ComCtrls, ToolWin;
procedure TForm???.FormCreate(Sender: TObject);
begin
with TToolButton.Create(Self) do
begin
Parent:=Form1.ToolBar1;
Caption:=(Sender as TForm).Name;
OnClick:=Form1.TBringToFront;
end;
end;
И так вопрос №2: Как можно осуществить в базе данных гибкий поиск, т.е. без учета регистра и количества символов, по нескольким полям? Отвечает Елена:
Хочу рассказать как я нахожу ищу необходимое в базе данных. Надеюсь, что это кому-нибудь поможет.
Locate
Этот универсальный метод поиска устанавливает текущую запись как первую строку, удовлетворяющую набору критериев поиска. Используя метод Locate мы можем искать значения одного или более полей, расположенных в массиве переменных. В приведённом ниже коде, метод Locate ищет первую запись, содержащую строку 'Zoom' в поле 'Name'. Если вызов Locate возвращает True - то запись найдена и установлена как текущая.
Table1.Locate('Name','Zoom',[]);
{...или...}
var ffield, fvalue: string;
opts : TLocateOptions;
ffield := 'Name';
fvalue := 'zoom';
opts := [loCaseInsensitive];
if not Table1.Locate(ffield, fvalue, opts) then ShowMessage(fvalue + ' not found in ' + ffield);
Теперь более гибкий поиск: поищем в запись со значениями полей OrganicNum = Edit1.Text и TheCoupon= Edit4.Text
loCaseInsensitive - поиск ведется без учета регистра букв, т.е. KeyValues будет считать слова "принтер" и "ПРИНТЕР", а также "ПрИнТеР" одинаковыми.
loPartialKey - запись считается удовлетворяющей условию поиска, если она содержит часть поискового контекста, например, удовлетворяющими контексту "Ма" будут признаны слова: "Мама", "Машина" и т.д.
Lookup
Метод Lookup не перемещает курсор в соответствующую строку, а только возвращает её значение. Lookup возвращает массив переменных, содержащих значения из полей, указанных в разделённом точкой с запятой списке имён, значения которых должны быть возвращены из интересующей нас строки. Если соответствующих нашему запросу строк не найдено, то Lookup вернёт пустую (Null) переменную.
Огромное спасибо, всем кто прислал ответы на вопросы!!
И по традиции еще несколько вопросов:
Возникла такая проблема: необходимо выводить список всего, что есть в автозагрузке. Как получить имя параметра, его тип и значение, а также путь к файлу, с которым этот параметр связан?
Если знаете ответ на этот вопрос, обязательно напишите автору :) Думаю исходники будут приветствоваться. А если сделаете еще и сайт поддержки для этой программы...
Если Вы знаете ответы на какие-то из этих вопросов, не пожалейте времени написать автору вопроса. А если Ваш ответ может претендовать на полноту, то и мне. А я эти ответы опубликую в следующих номерах. И наша рассылка будет востребованной. Сегодня поможете Вы, завтра Вам.