Вопрос № 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;{}
{**********************************************}
{*****Сюда я добавил потом еще пару строк******}
{***** для сортировки данных ******}
{**********************************************}
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