Попробуй так, я пробывал сэмитировать твой файл, вроде бы сработало. Может файлик выложишь сюда исходный, а то так не ясно, что делать.
while a<>'zxczxczxc' do
begin
readln(v,a);
s:='';
if pos('Date and Time: ',a)=1 then
begin
delete(a,1,15);
write(b,a);
end
else write(b,a);
writeln(b);
end;
_________________ Да здравствует то, благодаря чему, мы не смотря ни на что...
Member
Статус: Не в сети Регистрация: 14.08.2004 Откуда: Москва
Задолбался с Делфой... теперь не работает следующее извращение с файлом:
Код:
program Project3;
{$APPTYPE CONSOLE}
uses SysUtils;
var a,b:TextFile; s,ss:widestring; i,j:integer; begin assignfile(a,'out.txt'); reset(a); assignfile(b,'out2.txt'); rewrite(b); while s<>'zxczxczxc' do begin readln(a,s); if (ord(s[3])=47)and(ord(s[6])=47) then begin delete(s,1,12); write(b,s,' '); end else begin write(b,s); writeln(b); end; end; close(a); close(b); end.
Сейчас эта зараза решила заполнить выходной файл только на 24 килобайта и с чувством выполненного долга завершиться.. В чём у меня ошибка то? Если не в ДНК
так попробуй:
Считываемая строка не всегда может иметь 6 символов, как думаешь, что даст вот эта строчка (ord(s[6])=47) если символов в строке скажем 4?
while s<>'zxczxczxc' do
begin
readln(a,s);
if (length(s) > 5) and (ord(s[3])=47) and (ord(s[6])=47) then
begin
delete(s,1,11);
write(b,s,' ');
end else
begin
write(b,s);
writeln(b);
end;
end;
_________________ Да здравствует то, благодаря чему, мы не смотря ни на что...
Junior
Статус: Не в сети Регистрация: 30.12.2003 Откуда: Тихвин
Пишу приложение для запуска сторонней программы, но сторонняя программа не видна в запущенных приложениях в Диспетчере задач, а видна только как Процесс и висит в трэе.
Теперь вопрос:
Как проверить запущена эта программа или нет (висит в трэе и в процессах в дисп. задач)?
Т.е. я запускаю свою программу, проверяю запущена ли эта сторонняя прога и если не запущенна то запускаю.
Может кто ссылку даст или примерчик небольшой.
Member
Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Mickel_sys Вот что-то похожее
Код:
Объявляем сначала две глобальные переменные: var si:Tstartupinfo; p:Tprocessinformation; Затем по нужному событию, например, по нажатию на кнопке пишет такой код: FillChar( Si, SizeOf( Si ) , 0 ); with Si do begin cb := SizeOf( Si); dwFlags := startf_UseShowWindow; wShowWindow := 4; end; Form1.WindowState:=wsminimized; Createprocess(nil,'c:\windows\sndrec32.exe e:\temp.wav',nil,nil,false,Create_default_error_mode,nil,nil,si,p); Waitforsingleobject(p.hProcess,infinite); Form1.WindowState:=wsNormal;
А это по поиску процессов
Код:
Поставь на форму список TListbox и кнопку TButton, по нажатию на кнопке напиши такой код:
procedure TForm1.Button1Click(Sender: TObject); var Window:hWnd; buffer: array [0..127] of char; begin ListBox1.Clear; Window:=GetWindow(Handle,GW_HWNDFIRST); while Window<>0 do begin if (Window<>Application.Handle) and IsWindowVisible(Window) and (GetWindow(Window,GW_OWNER)=0) and (GetWindowText(Window,buffer,sizeof(buffer))<>0) then begin GetWindowText(Window,buffer,sizeof(buffer)); ListBox1.Items.Add(StrPas(buffer)); end; Window:=GetWindow(Window,GW_HWNDNEXT); end; ListBox1.ItemIndex:=0; end;
Как это сделано?
С помощью функции GetWindow() мы находим первое окно находящееся в z-последовательности, дескриптор найденного окна помещаем в переменную Window Window:=GetWindow(Handle,GW_HWNDFIRST);
после этого нужно оценить "чё, собственно, мы там нашли" :))
сначала исключаем возможность добавления собственного окна в список
if (Window<>Application.Handle) and
потом скажем, что добавляем окно в список только если оно видимо
IsWindowVisible(Window) and
только если оно не является дочерним и имеет заголовок
(GetWindow(Window,GW_OWNER)=0) and (GetWindowText(Window,buffer,sizeof(buffer))<>0)
И мол, только если найденное окно соответствует всем поставленным условиям, только тогда добавим его в список, после чего ищем следующее окно
Window:=GetWindow(Window,GW_HWNDNEXT);
и точно так же обрабатываем его.
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Mickel_sys Если искать по имени исполняемого файла, то можно так:
Код:
unit gkIsRunning;
interface
uses Windows, TlHelp32;
function IsRunning(const ExeFileName: String): Boolean;
implementation
function IsRunning(const ExeFileName: String): Boolean; var Handle: THandle; ProcessEntry32: TProcessEntry32; begin Handle:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); try if Handle <> -1 then begin ProcessEntry32.dwSize:= SizeOf(TProcessEntry32); if (Process32First(Handle, ProcessEntry32)) then repeat if ExeFileName = ProcessEntry32.szExeFile then begin Result:= True; Break; end; until not Process32Next(Handle, ProcessEntry32); end; finally CloseHandle(Handle); end; end;
end.
Просьба не пинать, писал навскидку. Пример использования:
Код:
procedure TForm1.Button1Click(Sender: TObject); begin if IsRunning('winamp.exe') then ShowMessage('Yes') else ShowMessage('No'); end;
Минус подобного подхода в том, что если файл будет переименован, то фиг получишь правильный резалт.
Лучше (надежней ИМХО) искать анализируя заголовок окна, используя GetWindowText + EnumWindowsProc & EnumWindows.
Vaitek Если заголовок меняется корректно самим процессом, то, как правило, базовое значение все равно присутствует.
Пример:
1. Microsoft Word
2. Документ1 - Microsoft Word
Именно поэтому я и написал об анализе заголовка окна.
Member
Статус: Не в сети Регистрация: 04.04.2005 Откуда: Екатеринбург
В исходниках одной программы увидел, что настройки сделаны через классы, решил сделать подобным образом,
но почему-то не хочет работать.
Вот как я сделеал:
Код:
unit ProgramSettings;
interface
uses SysUtils,Forms,Windows,Classes,JvSimpleXml;
type TProgrammSettings = class; TSettingsForms = class; TSettingsMain = class;
TProgrammSettings = class(TObject) protected XML:TJvSimpleXml; FRoot:TJvSimpleXmlElem; public Forms:TSettingsForms;// настройки главного окна procedure LoadSettings;// загружаем настройки end;
TSettingsForms = class(TProgrammSettings) public Main:TSettingsMain; end;
procedure TProgrammSettings.LoadSettings; var CurItem: TJvSimpleXmlElem; function GetCurItem(const ItemName: string): TJvSimpleXmlElem; begin Result := CurItem.Items.ItemNamed[ItemName]; if Result = nil then begin Result := CurItem.Items.Add(ItemName); Result.Parent := CurItem; end; end; begin XML:=TJvSimpleXml.Create(nil); FRoot:=TJvSimpleXmlElem.Create(nil); FRoot:=XML.Root; XML.LoadFromString('<?xml version="1.0" encoding="windows-1251"?><WERTEX Version="strVersion" Date="08.12.2005"><Settings><Forms><Main Top="100" Left="100" Width="730" Height="500" /></Forms></Settings></WERTEX>'); CurItem:=FRoot; CurItem:=GetCurItem('Settings'); CurItem:=GetCurItem('Forms'); CurItem:=GetCurItem('Main'); with CurItem do begin Forms.Main.Top:=CurItem.Properties.IntValue('Top',0); Forms.Main.Left:=Properties.IntValue('Left',100); Forms.Main.Width:=Properties.IntValue('Width',740); Forms.Main.Height:=Properties.IntValue('Height',540); end; end; end.
Дак вот, возникает следующая ошибка: EAccessViolation. Как я понял это возникает из-за того, что классы TSettingsForms и TSettingsMain не создаютя.
Каким образом можно исправит эту ошибку ?
Может я чего не понимаю, но перед использованием Forms наверное нужна строчка
Forms := TSettingsForms.Create;
А в конструкторе TSettingsForms строчка
Main := TSettingsMain.Create;
_________________ Да здравствует то, благодаря чему, мы не смотря ни на что...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения