Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Подготовка и выполнение запросов




Добавление новой формы для работы с запросами

Добавьте в приложение новую форму и положите на нее компонент Memo (закладка Standard), кнопку Button с надписью Выполнить запрос, сетку DbGrid и метки с соответствующими надписями, как показано на рис. 2.10. Дайте компоненту Memo имя MeSQL.

Рис. 2.10. Форма для выполнения запросов к БД

Командой File / Use Unit добавьте в список подключаемых модулей DatMod. На модуль dm положите компонент ADOQuery (закладка ADO) и источник DataSource, которому дайте имя dsQuery. Свяжите ADOQuery1 с ADOConnection1, какпоказанонарис. 2.11, свойство DataSet компонента dsQuery свяжитес ADOQuery1.

Рис. 2.11. Компоненты запроса ADOQuery1 и dsQuery

Перейдите к модулю Unit2 и свяжите сетку DbGrid1 с источником dsQuery1.

Компонент MeSQL будем использовать для записи текста запроса, сформулированного на языке SQL. Рассмотрим простейший запрос с текстом

select * from Инструменты

Этот запрос дает инструкцию для выборки всех полей (символ "*") и не ставит условий относительно того, какие записи следует выбирать. Это означает, что должны быть выбраны все записи таблицы.

Чтобы выполнить запрос будем использовать кнопку, по щелчку на которой запрос будет передан из MeSQL в ADOQuery1 и там выполнен. Создайте событие для щелчка на кнопке с таким кодом:

procedure TForm2.bQueryClick(Sender: TObject);
begin
With dm.ADOQuery1 do
try
Active:= false; // закрыть запрос
SQL.Assign(MeSQL.Lines); // передать запрос из MeSQL в ADOQuery1
Active:= true; // выполнить и открыть запрос
except // в случае ошибки
on e:Exception do
ShowMessage('Не удалось выполнить запрос.');
end;
end;

Действия, производимые этой процедурой, снабжены комментариями.

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

Рис. 2.12. Сетка с набором данных, сформированных запросом

Аналогично могут быть выполнены другие запросы. Более подробно вопросы подготовки и выполнения запросов были разобраны ранее при изучении материала по Теме № 2.

С качестве справочного материала можно использовать тексты программных модулей: Unit1.pas, Unit2.pas, DatMod.pas.

 

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls, DBCtrls, Mask, JPEG, KdnServ,
ComCtrls, Buttons, ExtDlgs;

type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
DBImage1: TDBImage;
GroupBox2: TGroupBox;
DBGrid3: TDBGrid;
Label2: TLabel;
DBImage2: TDBImage;
DBGrid4: TDBGrid;
Label1: TLabel;
sbInstAdd: TSpeedButton;
OpenPictureDialog1: TOpenPictureDialog;
sbPoverAdd: TSpeedButton;
GroupBox3: TGroupBox;
DBMemo1: TDBMemo;
GroupBox4: TGroupBox;
DBGrid2: TDBGrid;
DBGrid1: TDBGrid;
sbQuery: TSpeedButton;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure sbInstAddClick(Sender: TObject);
procedure sbPoverAddClick(Sender: TObject);
procedure sbQueryClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses DatMod, Unit2;

{$R *.dfm}

var FirstShow: boolean = true;

procedure TForm1.FormShow(Sender: TObject);
begin
if FirstShow then
begin
FirstShow:= false;
dm.TaList.Open;
dm.TaInst.Open;
dm.TaChar.Open;
dm.TaPover.Open;
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
dm.TaPover.Close;
dm.TaChar.Close;
dm.TaInst.Close;
dm.TaList.Close;
end;

procedure PictureToGraphicField(F: TField);
var FileName: TFileName;
Bmp: TBitmap;
jpg: TJPEGImage;
D: TDataSet;
begin
With dm, Form1 do
begin
D:= F.DataSet;
if D.Active then // если таблица открыта, то
if D.RecordCount > 0 then // если в таблице есть записи, то
if OpenPictureDialog1.Execute then // если файл картинки выбран, то
begin
if not (D.State in [dsEdit]) then D.Edit; // перевод таблицы в режим редактирования
FileName:= OpenPictureDialog1.FileName; // имя файла с картинкой
try
Bmp:= TBitmap.Create; // создаем Bitmap в памяти
jpg:= TJPEGImage.Create; // создаем JPEG
jpg.CompressionQuality:= 100; // качество сжатия изображения
jpg.Compress; // сжатие
jpg.LoadFromFile(FileName); // загрузка
bmp.Assign(jpg); // передача из JPEG в BMP
F.Assign(bmp); // передача картинки из Bitmap в поле "Каринка"
except // в случае исключительной ситуции делать:
D.Post; // сохранение записи
ShowMessage('Не удалось загрузить картинку.'); // сообщение об ошибке
FreeAndNil(jpg); // освобождение памяти, занятой JPEG
FreeAndNil(bmp); // освобождение памяти Bitmap
end;
end;
end;
end;

procedure TForm1.sbInstAddClick(Sender: TObject);
begin
PictureToGraphicField(dm.TaInst.FieldByName('Картинка'));
end;

procedure TForm1.sbPoverAddClick(Sender: TObject);
begin
PictureToGraphicField(dm.TaPover.FieldByName('Фото'));
end;

procedure TForm1.sbQueryClick(Sender: TObject);
begin
Form2.Show;
end;

end.

 

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, StdCtrls;

type
TForm2 = class(TForm)
Label1: TLabel;
MeSQL: TMemo;
DBGrid1: TDBGrid;
Label2: TLabel;
bQuery: TButton;
procedure bQueryClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

uses DatMod;

{$R *.dfm}

procedure TForm2.bQueryClick(Sender: TObject);
begin
With dm.ADOQuery1 do
try
Active:= false;
SQL.Assign(MeSQL.Lines);
Active:= true;
except
on e:Exception do
ShowMessage('Ошибкавыполнениязапроса.');
end;
end;

end.

 

unit DatMod;

interface

uses
SysUtils, Classes, DB, ADODB;

type
Tdm = class(TDataModule)
ADOConnection1: TADOConnection;
TaList: TADOTable;
ADOQuery1: TADOQuery;
dsList: TDataSource;
TaInst: TADOTable;
dsInst: TDataSource;
TaListId: TAutoIncField;
TaListDSDesigner: TWideStringField;
TaListDSDesigner2: TMemoField;
TaInstId: TAutoIncField;
TaInstListId: TIntegerField;
TaInstDSDesigner: TWideStringField;
TaInstDSDesigner2: TWideStringField;
TaInstDSDesigner3: TWideStringField;
TaInstDSDesigner4: TBlobField;
TaInstDSDesigner7: TBCDField;
TaChar: TADOTable;
dsChar: TDataSource;
TaCharId: TAutoIncField;
TaCharInstId: TIntegerField;
TaCharDSDesigner: TWideStringField;
TaCharDSDesigner2: TFloatField;
TaCharDSDesigner3: TWideStringField;
TaPover: TADOTable;
dsPover: TDataSource;
TaPoverId: TAutoIncField;
TaPoverInstId: TIntegerField;
TaPoverDSDesigner: TWideStringField;
TaPoverDSDesigner2: TDateTimeField;
TaPoverDSDesigner3: TBlobField;
TaPoverDSDesigner4: TWideStringField;
dsQuery: TDataSource;
TaInstDSDesigner5: TDateTimeField;
procedure TaInstBeforePost(DataSet: TDataSet);
procedure TaCharBeforePost(DataSet: TDataSet);
procedure TaPoverBeforePost(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end;

var
dm: Tdm;

implementation

{$R *.dfm}

procedure Tdm.TaInstBeforePost(DataSet: TDataSet);
begin
TaInstListId.Value:= TaListId.Value;
end;

procedure Tdm.TaCharBeforePost(DataSet: TDataSet);
begin
TaCharInstId.Value:= TaInstId.Value;
end;

procedure Tdm.TaPoverBeforePost(DataSet: TDataSet);
begin
TaPoverInstId.Value:= TaInstId.Value;
end;

end.

 

 

Примеры использования Drag and Drop для различных визуальных компонентов   Автор: Павел Перетаскивание информации с помощью мыши стало стандартом для программ, работающих в Windows. Часто это бывает удобно и позволяет добиться более быстрой работы. В данной статье я постарался показать максимальное количество примеров использования данной технологии при разработке приложений в среде Delphi. Конечно, результат может быть достигнут различными путями, продемонстрированные приемы не являются единственными и, возможно, не всегда самые оптимальные, но вполне работоспособны, и указывают направление поиска. Надеюсь, что они побудят начинающих программистов к более широкому использованию Drag'n'Drop в своих программах, тем более что пользователи, особенно неопытные, быстро привыкают к перетаскивание и часто его применяют. Проще всего делать Drag из тех компонентов, для которых однозначно ясно, что именно перетаскивать. Для этого устанавливаем у источника DragMode = dmAutomatic, а у приемника пишем обработчики событий OnDragOver - разрешение на прием, и OnDragDrop - действия, производимые при окончании перетаскивания. procedure TForm1.StringGrid2DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept:= Source = Edit1; // разрешено перетаскивание только из Edit1, // при работе программы меняется курсор end;   procedure TForm1.StringGrid2DragDrop(Sender, Source: TObject; X, Y: Integer); var ACol, ARow: Integer; begin StringGrid2.MouseToCell(X, Y, ACol, ARow); // находим, над какой ячейкой произвели Drop StringGrid2.Cells[Acol, Arow]:= Edit1.Text; // записываем в нее содержимое Edit1 end; Теперь рассмотрим копирование в упорядоченный список ListBox1 из другого списка. В OnDragOver проверяем, выбран ли хоть один элемент в источнике: Accept:= (Source = ListBox2) and (ListBox2.ItemIndex >= 0); В OnDragDrop ищем отмеченные в источнике строки (установлен множественный выбор) и добавляем только те, которых еще нет в приемнике: for i:= 0 to ListBox2.Items.Count - 1 do if (ListBox2.Selected[i]) and (ListBox1.Items.IndexOf(ListBox2.Items[i]) < 0) then ListBox1.Items.Add(ListBox2.Items[i]); Для ListBox2 реализуем перенос строк из ListBox1 и перестановку элементов в желаемом порядке. В OnDragOver разрешаем Drag излюбого ListBox: Accept:= (Source is TListBox) and ((Source as TListBox).ItemIndex >= 0); А OnDragDrop будет выглядеть так: var s: string; begin if Source = ListBox1 then begin ListBox2.Items.Add(ListBox1.Items[ListBox1.ItemIndex]); ListBox1.Items.Delete(ListBox1.ItemIndex); //удаляем перенесенный элемент end else //внутренняя перестановка begin s:= ListBox2.Items[ListBox2.ItemIndex]; ListBox2.Items.Delete(ListBox2.ItemIndex); ListBox2.Items.Insert(ListBox2.ItemAtPos(Point(X, Y), False), s); //находим, в какую позицию переносить и вставляем end; end; Научимся переносить текст в Memo, вставляя его в нужное место. Поскольку я выбрал в качестве источника любой из ListBox, подключим в Инспекторе Объектов для OnDragOver уже написанный ранее обработчик ListBox2DragOver, а в OnDragDrop напишем ifnot CheckBox1.Checked then // при включении добавляется в конец текста begin Memo1.SelStart:= LoWord(Memo1.Perform(EM_CHARFROMPOS, 0, MakeLParam(X, Y))); // устанавливаем позицию вставки согласно координатам мыши Memo1.SelText:= TListBox(Source).Items[TListBox(Source).ItemIndex]; end else memo1.lines.add(TListBox(Source).Items[TListBox(Source).ItemIndex]); Замечу, что для RichEdit EM_CHARFROMPOS работает несколько иначе, что продемонстрировано в следующем примере. Перенос из Memo реализован с помощью правой кнопки мыши, для того, чтобы не изменять стандартное поведение Memo, и поскольку нажатие левой кнопки снимает выделение. Для Memo1 установлено DragMode = dmManual, а перетаскивание инициируется в OnMouseDown if (Button = mbRight) and (Memo1.SelLength > 0) then Memo1.BeginDrag(True); Обработчик RichEdit1DragOver очевиден, а в RichEdit1DragDrop пишем var p: tpoint; begin ifnot CheckBox1.Checked then begin p:= point(x, y); RichEdit1.SelStart:= RichEdit1.Perform(EM_CHARFROMPOS, 0, Integer(@P)); RichEdit1.SelText:= Memo1.SelText; end else RichEdit1.Lines.Add(Memo1.SelText); end; Рассмотрим теперь перетаскивание в ListView1 (ViewStyle = vsReport). В OnDragOver разрешим прием из ListBox2 и из себя же: Accept:= ((Source = ListBox2) and (ListBox2.ItemIndex >= 0)) or (Source = Sender); А вот OnDragDrop теперь будет посложнее var Item, CurItem: TListItem; begin if Source = ListBox2 then begin Item:= ListView1.DropTarget; if Item <>nilthen // случайперетаскиванияна Caption if Item.SubItems.Count = 0 then Item.SubItems.Add(ListBox2.Items[ListBox2.ItemIndex]) // добавляем SubItem, если их еще нет else Item.SubItems[0]:= ListBox2.Items[ListBox2.ItemIndex] // иначе заменяем имеющийся SubItem else begin // при перетаскивании на пустое место создаем новый элемент Item:= ListView1.Items.Add; Item.Caption:= ListBox2.Items[ListBox2.ItemIndex]; end; end   else // случай внутренней перестановки begin CurItem:= ListView1.Selected; // запомнимвыбранныйэлемент Item:= ListView1.GetItemAt(x, y); // другой метод определения элемента на который делаем Drop if Item <>nilthen Item:= ListView1.Items.Insert(Item.Index) // вставляем новый элемент перед найденным else Item:= ListView1.Items.Add; // или добавляем новый элемент в конец Item.Assign(CurItem); // копируем исходный в новый CurItem.Free; // уничтожаем исходный end; end; Для ListView2 установим ViewStyle = vsSmallIcon и покажем, как вручную расставлять значки. В OnDragOver зададимусловие Accept:= (Sender = Source) and ([htOnLabel, htOnItem, htOnIcon] * ListView2.GetHitTestInfoAt(x, y) = []); // пересечение множеств должно быть пустым - запрещаем накладывать элементы а код в OnDragDrop очень простой: ListView2.Selected.SetPosition(Point(X, Y)); Перетаскивание в TreeView - довольно любопытная тема, здесь порой приходится разрабатывать алгоритмы обхода ветвей для достижения желаемого поведения. Для TreeView1 разрешим перестановку своих узлов в другое положение. В OnDragOver проверим, не происходит ли перетаскивание узла на свой же дочерний во избежание бесконечной рекурсии: var Node, SelNode: TTreeNode; begin Node:= TreeView1.GetNodeAt(x, y); // находимузел-приемник Accept:= (Sender = Source) and (Node <>nil); ifnot Accept then Exit; SelNode:= Treeview1.Selected; while (Node.Parent <>nil) and (Node <> SelNode) do begin Node:= Node.Parent; if Node = SelNode then Accept:= False; end; Код OnDragDrop выглядиттак: var Node, SelNode: TTreeNode; begin Node:= TreeView1.GetNodeAt(X, Y); if Node = nilthen Exit; SelNode:= TreeView1.Selected; SelNode.MoveTo(Node, naAddChild); // все уже встроено в TreeView end; Теперь разрешим перенос в TreeView2 из TreeView1 Accept:= (Source = TreeView1) and (TreeView2.GetNodeAt(x, y) <> nil); И в OnDragDrop копируем выбранную в TreeView1 ветвь во всеми подветвями, для чего придется сделать рекурсивный обход: var Node: TTreeNode;   procedure CopyNode(FromNode, ToNode: TTreeNode); var TempNode: TTreeNode; i: integer; begin TempNode:= TreeView2.Items.AddChild(ToNode, ''); TempNode.Assign(FromNode); for i:= 0 to FromNode.Count - 1 do CopyNode(FromNode.Item[i], TempNode); end;   begin Node:= TreeView2.GetNodeAt(X, Y); if Node = nilthen Exit; CopyNode(TreeView1.Selected, Node); end; Рассмотрим теперь перенос ячеек в StringGrid1. Поскольку, как и в случае с Memo, простое нажатие левой кнопки занято под другие действия, установим DragMode = dmManual и будем запускать Drag при нажатии левой кнопки, удерживая клавиши Alt или Ctrl. Запишем в OnMouseDown: var Acol, ARow: Integer; begin with StringGrid1 do if (ssAlt in Shift) or (ssCtrl in Shift) then begin MouseToCell(X, Y, Acol, Arow); if (Acol >= FixedCols) and (Arow >= FixedRows) then // не будем перетаскивать из фиксированных ячеек begin if ssAlt in Shift then Tag:= 1 elseif ssCtrl in Shift then Tag:= 2; // запомним что нажато - Alt или Ctrl - в Tag StringGrid1 BeginDrag(True) end else Tag:= 0; end; end; Код OnDragOver учитывает также возможность перетаскивания из StringGrid2 (описание ниже) var Acol, ARow: Integer; begin with StringGrid1 do begin MouseToCell(X, Y, Acol, Arow); Accept:= (Acol >= FixedCols) and (Arow >= FixedRows) and (((Source = StringGrid1) and (Tag > 0)) or (Source = StringGrid2)); end; Часть OnDragDrop, относящаяся к внутреннему переносу: var ACol, ARow, c, r: Integer; GR: TGridRect; begin StringGrid1.MouseToCell(X, Y, ACol, ARow); if Source = StringGrid1 then with StringGrid1 do begin Cells[Acol, Arow]:= Cells[Col, Row]; //копируем ячейку-источник в приемник if Tag = 1 then Cells[Col, Row]:= ''; // очищаем источник, если было нажато Alt Tag:= 0; end; А вот из StringGrid2 сделаем перенос выбранного диапазона ячеек с помощью правой кнопки, для этого в OnMouseDown if Button = mbRight then StringGrid2.BeginDrag(True); И теперь часть StringGrid1DragDrop, относящаяся к переносу из StringGrid2: if Source = StringGrid2 then begin GR:= StringGrid2.Selection; // Selection - выделенные в StringGrid2 ячейки for r:= 0 to GR.Bottom - GR.Top do for c:= 0 to GR.Right - GR.Left do if (ACol + c < StringGrid1.ColCount) and (ARow + r < StringGrid1.RowCount) then // застра***мся от записи вне StringGrid1 StringGrid1.Cells[ACol + c, ARow + r]:= StringGrid2.Cells[c + GR.Left, r + GR.Top]; end; Теперь покажем, как этот диапазон ячеек из StringGrid2 перенести в Memo2. Для этого в OnDragOver Memo2 пишем: Accept:= (Source = StringGrid2) or (Source = DBGrid1); и в OnDragDrop Memo2: var c, r: integer; s: string; begin Memo2.Clear; if Source = StringGrid2 then with StringGrid2 do for r:= Selection.Top to Selection.Bottom do begin s:= ''; for c:= Selection.Left to Selection.Right do s:= s + Cells[c, r] + #9; // разделим ячейки табуляцией memo2.lines.add(s); end Кроме того, в Memo2 можно переносить выбранную запись из DBGrid1, у которого установлено в Options dgRowSelect = True. В сетке отображается таблица из стандартной поставки Delphi DBDEMOS - Animals.dbf. Перетаскивание осуществляется аналогично StringGrid2, правой кнопкой мыши, только по событию OnMouseMove if ssRight in Shift then DBGrid1.BeginDrag(true); Код в Memo2DragDrop, относящийся к переносу из DBGrid1: else with DBGrid1.DataSource.DataSet do begin s:= ''; for c:= 0 to FieldCount - 1 do s:= s + Fields[c].AsString + ' | '; memo2.lines.add(s); end; // в случае dgRowSelect = False для переноса одного поля достаточно сделать // memo2.lines.add(DbGrid1.SelectedField.AsString); Drag из DBGrid1 принимается также на Panel3, условие приема очевидно, а OnDragDrop выглядит так: Panel3.Height:= 300; // раскрываем панель Image1.visible:= True; OleContainer1.Visible:= false; Image1.Picture.Assign(DBGrid1.DataSource.DataSet.FieldByName('BMP')); // показываем графическое поле текущей записи таблицы Теперь покажу, как можно передвигать мышью визуальные компоненты в Run-Time. Для Panel1 установим DragMode = dmAutomatic, в OnDragOver формы пишем: var Ct: TControl; begin Ct:= ControlAtPos(Point(X + Panel1.Width, Y + Panel1.Height), True, True); // для упрощения проверяем перекрытие с другими контролами только правого нижнего угла Accept:= (Source = Panel1) and ((Ct = nil) or (Ct = Panel1)); и в OnDragDrop формы очень просто Panel1.Left:= X; Panel1.Top:= Y; Другой метод перетаскивания можно встретить в каждом FAQ по Delphi: procedure TForm1.Panel2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); const SC_DragMove = $F012; begin ReleaseCapture; Panel2.Perform(WM_SysCommand, SC_DragMove, 0); end; И в завершение реализация популярной задачи перетаскивания значков файлов на форму из Проводника. Для этого следует описать обработчик сообщения WM_DROPFILES private procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES; В OnCreate формы разрешить прием файлов DragAcceptFiles(Handle, true); и в OnDestroy отключить его DragAcceptFiles(Handle, False); Процедура обработки приема файлов может выглядеть так: procedure TForm1.WMDropFiles(var Msg: TWMDropFiles); const maxlen = 254; var h: THandle; //i,num:integer; pchr: array[0..maxlen] of char; fname: string; begin h:= Msg.Drop;   // дана реализация для одного файла, а //если предполагается принимать группу файлов, то можно добавить: //num:=DragQueryFile(h,Dword(-1),nil,0); //for i:=0 to num-1 do begin // DragQueryFile(h,i,pchr,maxlen); //...обработка каждого //end;   DragQueryFile(h, 0, pchr, maxlen); fname:= string(pchr); if lowercase(extractfileext(fname)) = '.bmp' then begin Image1.visible:= True; OleContainer1.Visible:= false; image1.Picture.LoadFromFile(fname); Panel3.Height:= 300; end elseif lowercase(extractfileext(fname)) = '.doc' then begin Image1.visible:= False; OleContainer1.Visible:= True; OleContainer1.CreateObjectFromFile(fname, false); Panel3.Height:= 300; end elseif lowercase(extractfileext(fname)) = '.htm' then ShellExecute(0, nil, pchr, nil, nil, 0) elseif lowercase(extractfileext(fname)) = '.txt' then Memo2.Lines.LoadFromFile(fname) else Memo2.Lines.Add(fname); DragFinish(h); end; При перетаскивании на форму файла с расширением Bmp он отображается в Image1, находящемся на Panel3, Doc загружается в OleContainer, для Htm запускается Internet Explorer или другой браузер по умолчанию, Txt отображается в Memo2, а для остальных файлов в Memo2 будет просто показано имя. Полагаю, на основе содержащихся в статье приемов будет нетрудно организовать перетаскивание и для других, не описанных здесь, визуальных компонентов.
 
Проект Delphi World © Выпуск 2002 - 2004 Автор проекта: ___Nikolay

 




Поделиться с друзьями:


Дата добавления: 2015-05-09; Просмотров: 973; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.