Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Вниз

Скроллинг в Мемо   Найти похожие ветки 

 
Rule ©   (2005-03-16 11:11) [0]

у меня выполняется консольное приложение и оно выдет результаты... я их перехватываю и записываю в мемо, но одна проблемма как мне сделать скроллинг, я после каждой порции записаной информации в мемо перехожу на последнюю строку в Мемо, но при следующем запуске Memo1.Lines.text:=Memo1.Lines.text+buffer; текст в Мемо листается опять на начало .... и естественно возникает неприятный эфект поргания, чего делать ??? подскажите, метод add  не помогает, так как он вставляет символ конца строки ... а эти символы уже есть в тексте который я вередаю ...

Помогите пожалуйста ...


 
Rule ©   (2005-03-16 11:13) [1]

собственно функция

function GetDosOutput(const CommandLine: string; var M:TMemo): string;
var
 SA: TSecurityAttributes;
 SI: TStartupInfo;
 PI: TProcessInformation;
 StdOutPipeRead, StdOutPipeWrite: THandle;
 WasOK: Boolean;
 Buffer: array[0..255] of Char;
 BytesRead: Cardinal;
 WorkDir, Line: string;
begin
 Application.ProcessMessages;
 with SA do
 begin
   nLength := SizeOf(SA);
   bInheritHandle := True;
   lpSecurityDescriptor := nil;
 end;
 // созда?м пайп для перенаправления стандартного вывода
 CreatePipe(StdOutPipeRead, // дескриптор чтения
   StdOutPipeWrite, // дескриптор записи
   @SA, // аттрибуты безопасности
   0 // количество байт принятых для пайпа - 0 по умолчанию
   );
 try
   // Созда?м дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода,
   // а так же проверяем, чтобы он не показывался на экране.
   with SI do
   begin
     FillChar(SI, SizeOf(SI), 0);
     cb := SizeOf(SI);
     dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
     wShowWindow := SW_HIDE;
     hStdInput := GetStdHandle(STD_INPUT_HANDLE); // стандартный ввод не перенаправляем
     hStdOutput := StdOutPipeWrite;
     hStdError := StdOutPipeWrite;
   end;

   // Запускаем компилятор из командной строки
   WorkDir := ExtractFilePath(CommandLine);
   WasOK := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, nil, SI, PI);

   // Теперь, когда дескриптор получен, для безопасности закрываем запись.
   // Нам не нужно, чтобы произошло случайное чтение или запись.
   CloseHandle(StdOutPipeWrite);
   // если процесс может быть создан, то дескриптор, это его вывод
   if not WasOK then
     raise Exception.Create("Could not execute command line!")
   else
   try
       // получаем весь вывод до тех пор, пока DOS-приложение не будет завершено
     Line := "";
     M.Lines.Text:="";
     repeat
         // читаем блок символов (могут содержать возвраты каретки и переводы строки)
       WasOK := ReadFile(StdOutPipeRead, Buffer, 10, BytesRead, nil);

         // есть ли что-нибудь ещ? для чтения?
       if BytesRead > 0 then
       begin
           // завершаем буфер PChar-ом
         Buffer[BytesRead] := #0;
         OemToAnsi(Buffer, Buffer);
           // добавляем буфер в общий вывод
         Line := Line + Buffer;
         M.Lines.Text:=M.Lines.Text+Buffer;
         M.SelStart:=M.SelStart+10;
         with M do
           begin
             SelStart := Length(Text);
             Perform(EM_SCROLLCARET, 0, 0);
           end;                                
         //SendMessage(M.Handle, EM_SCROLL, SB_LINEDOWN, 0);
         Application.ProcessMessages;
       end;
     until not WasOK or (BytesRead = 0);
       // жд?м, пока завершится консольное приложение
     WaitForSingleObject(PI.hProcess, INFINITE);
   finally
       // Закрываем все оставшиеся дескрипторы
     CloseHandle(PI.hThread);
     CloseHandle(PI.hProcess);
   end;
 finally
   result := Line;
   CloseHandle(StdOutPipeRead);
 end;
end;


 
Rouse_ ©   (2005-03-16 11:35) [2]

M.Lises.BeginUpdate;
// добавляешь
SendMessage(M.Handle, WM_VSCROLL,SB_BOTTOM,0);
M.Lises.EndUpdate;


 
Rouse_ ©   (2005-03-16 11:36) [3]

> метод add  не помогает, так как он вставляет символ конца
> строки ... а эти символы уже есть в тексте который я вередаю

А еще проще - удалять #13#10 из строки пред Add


 
Rule ©   (2005-03-16 11:46) [4]

Rouse_ ©   (16.03.05 11:36) [3]
думал об этом ... както непрофессионально получается ... надо стремится к правильному коду :-) ... Спасибо Саня, первый вариант отлично работает :-)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.217 c
1-1110804922
starik30
2005-03-14 15:55
2005.03.27
Обработка нажатия клавиш ALT+ в Application.OnMessage


14-1109929469
Doxygen
2005-03-04 12:44
2005.03.27
Немецкие умляуты


1-1111061635
Быстрый Шу
2005-03-17 15:13
2005.03.27
Приведение типа Variant


3-1109232078
Топпер
2005-02-24 11:01
2005.03.27
Log FireBird1.5 SS под Linux


3-1109061060
Ragazor
2005-02-22 11:31
2005.03.27
Как правильно настроить Paradox базу через ODBC?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский