Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 160
от 22.06.2005, 22:30

Администратор:Калашников О.А.
В номере:Вопросов: 4, Ответов: 10


Вопрос № 22281: Как с 2 ShellistView можно копировать с помощью Drag&Drop. Пожалуйста,пришлите исходник на email Sassoft@mail.ru...
Вопрос № 22306: Здравствуйте.Скачал компонент TGIFImage v2.2(модификация для delphi 6,7) с www.torry.net Как правильно его установить в Delphi7.Подскажите пожалуста...
Вопрос № 22307: Здравствуйте уважаемые эксперты! Как вывести данные полученные от консольного приложения, например, в memo?? Т.е. имеется консольная программа, она что-то выводит в своё окно (консольное) как копировать эти данные в memo?? Всем спасибо за отв...
Вопрос № 22311: Здравия желаю, Уважаемые! Большое Спасибо всем, кто откликнулся на мое письмо № 21991. БД я почти написал (т.е. уже можно добавлять, удалять, редактировать записи). БД написал использую технолгогию ADO. Сейчас я пытаюсь сделат...

Вопрос № 22.281
Как с 2 ShellistView можно копировать с помощью Drag&Drop.
Пожалуйста,пришлите исходник на email Sassoft@mail.ru
Отправлен: 17.06.2005, 10:38
Вопрос задал: Sassoft (статус: Посетитель)
Всего ответов отправлено: 1

Отвечает: Gin
Здравствуйте, Sassoft!
Ответ не настолько прост как задан вопрос (разумеется если Вас интересует не только голословное "копировать с помощью Drag&Drop", а и что кроется за ним).
К сожалению сервер не принял большой размер - выслал на почтовый ящик (тема ДрагенДропинг).
В письме статья которую нужно сохранить на винчестере с расширением html. В Вашем браузере изучите примеры из статьи, возможно, пригАдится. Все из ненужного ампутировано.
Если этого будет недостаточно - пожалуйста обращайтесь (есть еще кое-что) через рассылку.
Приятного Вам изучения.
С Уважением, Gin.Здравствуйте, Sassoft!
Ответ отправил: Gin (статус: 6-ой класс)
Отправлен: 17.06.2005, 17:03
Оценка за ответ: 5
Комментарий оценки:
СПАСИБО!!!!!!!


Вопрос № 22.306
Здравствуйте.Скачал компонент TGIFImage v2.2(модификация для delphi 6,7) с www.torry.net
Как правильно его установить в Delphi7.Подскажите пожалуста
Отправлен: 17.06.2005, 19:32
Вопрос задал: Dovgotko Vadym Vit. (статус: Посетитель)
Всего ответов отправлено: 2

Отвечает: Denisss
Здравствуйте, Dovgotko Vadym Vit.!
Копируете файл GifImage.pas в любую удобную для Вас папку.
Открываете Delphi, жмете меню "Component"->"Install component"
Заполняете все поля:
(но сначала выберите тип установки: в существующий пакет "Into Existing Package", либо в новый пакет "Into New Package")
Unit filename: Путь к файлу GifImage.pas
Search Path: папка, в которой лежит GifImage.pas
Package FileName: имя пакета (если добавляете в существующий, то выберите из списка, если в новый, то напишите любое имя, но не GifImage, т.к. так называется файл, можно назвать, например, TGIFIMG.dpk)
Package Description: описание пакета (если Вы добавляете в старый пакет, то это поле изменять нельзя.
Жмем кнопку ОК.
Появится окошечко, в котором надо нажать кнопку "Install".
Если появится сообщение, что появился новый компонент: GifImage.TGifImage, то все ОК.
Ответ отправил: Denisss (статус: 6-ой класс)
Отправлен: 17.06.2005, 19:52

Отвечает: Jadd
Здравствуйте, Dovgotko Vadym Vit.!
На torry.net тысячи компонентов, думаете эксперты знают про всех их? С компонентом наверняка идет readme, в котором про это пишется. От себя скажу, если с компонентом идет файл dpk, открывапешь его в дельфе и инсталлишь. Если нет такого, то ищешь модул с методом RegisterComponent и в меню Conponents выбираешь Install.
---------
Hakuna matata
Ответ отправил: Jadd (статус: Студент)
Отправлен: 17.06.2005, 22:29


Вопрос № 22.307
Здравствуйте уважаемые эксперты!
Как вывести данные полученные от консольного приложения, например, в memo?? Т.е. имеется консольная программа, она что-то выводит в своё окно (консольное) как копировать эти данные в memo??
Всем спасибо за ответы.
Отправлен: 17.06.2005, 19:33
Вопрос задал: And1 (статус: 2-ой класс)
Всего ответов отправлено: 4

Отвечает: Denisss
Здравствуйте, And1!
Есть несколько способов, но самый простой, на мой взгляд, это:
1. Запустить консольное приложение с помощью CreateProcess (см. приложение) (в примере запускается консольное приложение e:upxupx.exe) с параметром >somefile (в примере это >file.txt)
2. Дождаться завершения этого приложения
3. Считать в Memo информацию из somefile
4. Удалить за ненадобностью файл somefile

Приложение:

Ответ отправил: Denisss (статус: 6-ой класс)
Отправлен: 17.06.2005, 20:21

Отвечает: Jadd
Здравствуйте, And1!
Тут уже был подобный вопрос, и я нанего подробно отвечал. Так что не буду повторяться. Скажу лишь, что темя, которую нужно найти в MSDN - пайпы и ввод/вывод в/из пайпов (CreatePipe). Там же есть пример, правда на С, но юзая те же WinAPI функции тоже самое легко сделать в дельфях. Попробуй, а если не получится, пиши и я пришлю код с разъяснениями.
---------
Hakuna matata
Ответ отправил: Jadd (статус: Студент)
Отправлен: 17.06.2005, 22:17

Отвечает: Gin
Здравствуйте, And1!
Код не мой (где-то давно скопировал), разбирайтесь:
procedure ExecConsoleApp(CommandLine: AnsiString; Output: TStringList; Errors:TStringList);
var
sa : TSECURITYATTRIBUTES;
si : TSTARTUPINFO;
pi : TPROCESSINFORMATION;
hPipeOutputRead : THANDLE;
hPipeOutputWrite : THANDLE;
hPipeErrorsRead : THANDLE;
hPipeErrorsWrite : THANDLE;
Res, bTest : Boolean;
env : array[0..100] of Char;
szBuffer : array[0..256] of Char;
dwNumberOfBytesRead: DWORD;
Stream : TMemoryStream;
begin
sa.nLength := sizeof(sa);
sa.bInheritHandle := true;
sa.lpSecurityDescriptor := nil;
CreatePipe(hPipeOutputRead, hPipeOutputWrite, @sa, 0);
CreatePipe(hPipeErrorsRead, hPipeErrorsWrite, @sa, 0);
ZeroMemory(@env, SizeOf(env));
ZeroMemory(@si, SizeOf(si));
ZeroMemory(@pi, SizeOf(pi));
si.cb := SizeOf(si);
si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
si.wShowWindow := SW_HIDE;
si.hStdInput := 0;
si.hStdOutput := hPipeOutputWrite;
si.hStdError := hPipeErrorsWrite;
{ Если вы хотите запустить процесс без параметров, заnil`те второй параметр
и используйте первый
}
Res := CreateProcess(nil, pchar(CommandLine), nil, nil, true,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, @env, nil, si, pi);
// Если не получилось - то выходим
if not Res then
begin
CloseHandle(hPipeOutputRead);
CloseHandle(hPipeOutputWrite);
CloseHandle(hPipeErrorsRead);
CloseHandle(hPipeErrorsWrite);
Exit;
end;
CloseHandle(hPipeOutputWrite);
CloseHandle(hPipeErrorsWrite);
//Читаем вывод
Stream := TMemoryStream.Create;
try
while true do
begin
bTest := ReadFile(hPipeOutputRead, szBuffer, 256, dwNumberOfBytesRead, nil);
if not bTest then
begin
break;
end;
Stream.Write(szBuffer, dwNumberOfBytesRead);
end;
Stream.Position := 0;
Output.LoadFromStream(Stream);
finally
Stream.Free;
end;
//Вывод о ошибках
Stream := TMemoryStream.Create;
try
while true do
begin
bTest := ReadFile(hPipeErrorsRead, szBuffer, 256, dwNumberOfBytesRead, nil);
if not bTest then
begin
break;
end;
Stream.Write(szBuffer, dwNumberOfBytesRead);
end;
Stream.Position := 0;
Errors.LoadFromStream(Stream);
finally
Stream.Free;
end;
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(hPipeOutputRead);
CloseHandle(hPipeErrorsRead);
end;

//Пример использования:
procedure TForm1.Button1Click(Sender: TObject);
var OutP : TStringList;
ErrorP: TStringList;
begin
OutP := TStringList.Create;
ErrorP := TstringList.Create;
ExecConsoleApp(ping localhost, OutP, ErrorP);
Memo1.Lines.Assign(OutP);
OutP.Free;
ErrorP.Free;
end;
С Уважением, Gin.
Ответ отправил: Gin (статус: 6-ой класс)
Отправлен: 18.06.2005, 00:09

Отвечает: sir henry
Здравствуйте, And1!
А Вы сделайте так, чтобы консольная программа данные свои выводила не в окно, а в текстовый файл. Тогда просто можно файл загрузить в мемо.
TMemo.Lines.LoadFromFile('Имя_файла.txt');
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 18.06.2005, 08:04


Вопрос № 22.311
Здравия желаю, Уважаемые!
Большое Спасибо всем, кто откликнулся на мое письмо № 21991. БД я почти написал (т.е. уже можно

добавлять, удалять, редактировать записи). БД написал использую технолгогию ADO. Сейчас я пытаюсь

сделать сортировку данных, но у меня ничего не получается. К тому же мне потом надо будет сделать

и выборку данных. Короче, ситуация следующая. Есть форма FrmDat. На форме следующие компоненты:
-DBGrid с именем DBGrid;
-ADOConnection с именем ADOConnect;
-DataSource с именем DataSource;
-ADOTable с именем ADOTable.
(Есть еще различные кнопки-Button, но это не важно)
В папке, в которой находится программа, находиться файл БД Access dates.mdb. В этой базе есть

таблица TabData. В ней три поля:
-Number :счетчик (ключевое поле);
-Date :дата/время;
-Commentary :текстовый[150].
Связывание этих компонентов между собой, а также с физической БД я осуществил программным путем в

процедуре TFrmDat.FormCreate. Вот часть кода, отвечающего за связыване:
=====================================================
{Определяем путь к БД}
getdir(0,PathBD);
if PathBD[length(PathBD)]<>'' then PathBD:=PathBD+'';
PathBD:=PathBD+'dates.mdb';

{Подключаем ADOConnect к физической БД}
with ADOConnect do begin
Close;
LoginPrompt := False;
ConnectionString:= 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+PathBD+';Persist Security Info=False';
Connected:= True;
end;

{Подключаем DBGrid к ADOConnect}
ADOTable.Connection:=ADOConnect;
ADOTable.TableName:='TabData';
ADOTable.Active:=false;{}

DataSource.DataSet:=ADOTable;

DBGrid.Columns.Add;
DBGrid.Columns[0].FieldName:='Date';
DBGrid.Columns[0].Title.caption:='Дата';
DBGrid.Columns[0].Title.Alignment:=taCenter;
DBGrid.Columns[0].Width:=80;
DBGrid.Columns.Add;
DBGrid.Columns[1].FieldName:='Commentary';
DBGrid.Columns[1].Title.caption:='Комментарий';
DBGrid.Columns[1].Title.Alignment:=taCenter;
DBGrid.Columns[1].Width:=710;

{**********************************************}
{*****Сюда я добавил потом еще пару строк******}
{***** для сортировки данных ******}
{**********************************************}
ADOTable.Active:=true;

DBGrid.Refresh;{}
=====================================================
Когда запускаеш программу, появляется окно с сеткой DBGrid, в которой отражены данные из БД. Все

вроде нормально, но данные не упорячнены. Вот я и решил их упорядочить по столбцу "Дата" (поле

Date таблицы TabData). Для этого я на форму кинул компонент ADOQuery с именем ADOQuery, и в

процедуру TFrmDat.FormCreate добавил следующий код:
=====================================================
ADOQuery.Connection:=ADOConnect;
ADOQuery.Close;
ADOQuery.DataSource:=DataSource;
DBGrid.DataSource:=DataSource;{}
with ADOQuery do begin
with SQL do begin
Clear;
Add('SELECT TabData.Date, TabData.Commentary ');
Add('FROM TabData ');
Add('ORDER BY TabData.Date');
end;
Open;
end; {}
=====================================================
Но при запуске программы ничего не изменилось. Открывается окно с сеткой с двумя столцами, и

данные в этой сетке неотсортированы. Что я делаю не так? Что надо добавить или удалить из кода?

Если кто знает, прошу подскажите как надо сделать.
Жду Ваших советов.
С Уважением,
Александр (zimorodokbrest@rambler.ru)

Приложение:

Отправлен: 17.06.2005, 20:39
Вопрос задал: Зимородкин Александр (статус: Посетитель)
Всего ответов отправлено: 3

Отвечает: Denisss
Здравствуйте, Зимородкин Александр!
Создал я базу данных, аналогичную Вашей, прописал все как у Вас.
(единственное, заменил //ADOQuery.DataSource:=DataSource; на
DataSource.DataSet:= ADOQuery;)
и у меня все работает.
Таким образом возникает вопрос: а Вы удалили с формы компонент TADOTable?
Примечание:
когда идет запрос к одной таблице, то можно имя таблицы опускать. Т.е., в Вашем случае, запрос можно построить следующим образом:
SELECT Date, Commentary FROM TabData
ORDER BY Date
Ответ отправил: Denisss (статус: 6-ой класс)
Отправлен: 17.06.2005, 21:29
Оценка за ответ: 5

Отвечает: Jadd
Здравствуйте, Зимородкин Александр!
Объясняю. Когда ты делаешь запрос к базе данных, компонент получает не таблоицу или адреса блоков данных на жестком диске, а рекордсет. Это не что иное, как массив рекордов, отображенный в ПАМЯТЬ!!!!!!! Для каждого компонента TDataSet свое отображение. Так что TADOQuery содержит свой рекордсет, а TADOTable - свой, что вполне логично. Так что берем TADOTable и устанавливаем свойства Index и читаем в хелпе про них.
---------
Hakuna matata
Ответ отправил: Jadd (статус: Студент)
Отправлен: 17.06.2005, 22:24
Оценка за ответ: 4

Отвечает: Tsechoev Bagaudin
Здравствуйте, Зимородкин Александр!
Если Вы хотели использовать изначально ADOTable и ради сортировки решили прибегнуть к ADOQuery, то в этом небыло необходимости. Ваша проблема решается очень просто:
ADOTable.IndexFieldNames :='Date';
При этом ненужно закрывать таблицу, а потом ее открывать. Раз уж количество данных вам позволяет загружать таблицу быстро, то данный вид сортировки будет работать намного быстрее и ресурсов у компа заберет намного меньше, потому что ADO сама сортирует забранные уже ею в память данные.
Если хочется сделать сортировку понескольким столбцам просто указываешь их встроке через точку с запятой, согласно приоритету, например:
ADOTable.IndexFieldNames :='Date;Commentary';
Удачи!

---------
Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: Tsechoev Bagaudin (статус: 3-ий класс)
Отправлен: 17.06.2005, 22:35
Оценка за ответ: 5


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Отписаться
Вспомнить пароль

В избранное