Главная страница
    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.065 c
9-1105126758
Micker2
2005-01-07 22:39
2005.03.27
Физика объектов в 2d


1-1110895989
Alex Romanskiy
2005-03-15 17:13
2005.03.27
Как уменьшить картинку.


14-1109344351
cyborg
2005-02-25 18:12
2005.03.27
Самопальный форум


3-1109412494
Walker
2005-02-26 13:08
2005.03.27
Нужен компонент а-ля Access "поле со списком"


14-1110145154
cspr
2005-03-07 00:39
2005.03.27
Подскажите что за дрянь :-) ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский