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

Вниз

Ув. Доны подскажите понадобилось считать параметры командной   Найти похожие ветки 

 
JTAG   (2005-11-22 15:32) [0]

строки при запуске программы, разыскал в хелпе функцию ParamStr
в обработчик создания формы написал такой код

procedure TForm1.FormCreate(Sender: TObject);
var p0,p1:string;
begin
p0:=paramstr(0);
form1.Memo1.Lines.Append("p0="+p0+"  ");
p1:=paramstr(1);
form1.Memo1.Lines.Append("p1="+p1+"  ");
end;
В надежде что в переменных р1, р2 у меня будет параметры моей строки при запуске, но в переменные р1,р2 содержат одни и теже данные путь к моей проги , как правильно считьать параметры командной строки


 
Tonich ©   (2005-11-22 15:34) [1]


> путь к моей проги

содержиться только в  
> paramstr(0);

а во всех остальных параметры


 
JTAG   (2005-11-22 15:35) [2]

вроде заработало , ничего не делал , нигде ни правил только делфю пепрегрузил


 
System   (2005-11-26 00:48) [3]

>>вроде заработало , ничего не делал , нигде ни правил только делфю пепрегрузил

чтобы точно работало попробуй:

procedure TForm1.FormCreate(Sender: TObject);
var
path:string;
i:integer;
begin
if paramstr(1)<>"" then
begin
for i:=1 to paramcount do
path:=path+paramstr(i)+" ";
end;


 
gdaujk ©   (2005-11-26 02:00) [4]

Для Win2k:

function CommandLineToArgvW(lpCmdLine: LPCWSTR; var pNumArgs: Integer): PPWideChar; stdcall;

implementation

{$R *.dfm}

function CommandLineToArgvW; external "shell32.dll" name "CommandLineToArgvW";

{GetMeParamStr}

function gdaParamStr(aLines: TStrings): string;
var
 NumArgs, i: Integer;
 pArgs: PPWideChar;
begin
 pArgs := CommandLineToArgvW(GetCommandLineW, NumArgs);
 for i := 1 to NumArgs do
 begin
   aLines.Add(pArgs^);
   Inc(pArgs);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 gdaParamStr(Memo1.Lines);
end;


 
GuAV ©   (2005-11-26 12:39) [5]

gdaujk ©   (26.11.05 2:00) [4]

А освобождать pArgs кто будет ?


 
gdaujk ©   (2005-11-27 00:11) [6]

GuAV ©   (26.11.05 12:39) [5]

И точно, поспешишь - людей насмешишь...

Remarks

It is the caller"s responsibility to free the memory used by the argument list when it is no longer needed. To free the memory, use a single call to either the GlobalFree or LocalFree function.


 
gdaujk ©   (2005-11-27 00:30) [7]

Вот так наверное правильно:

function gdaParamStr(aLines: TStrings): string;
var
 NumArgs, i: Integer;
 pArgs: PPWideChar;
 pTemp: Pointer;
 hMem: HGLOBAL;
begin
 pArgs := CommandLineToArgvW(GetCommandLineW, NumArgs);
 pTemp := pArgs;
 for i := 1 to NumArgs do
 begin
   aLines.Add(pArgs^);
   Inc(pArgs);
 end;
 hMem := GlobalHandle(pTemp);
 GlobalFree(hMem);
end;


 
gdaujk ©   (2005-11-27 00:53) [8]

GuAV ©   (26.11.05 12:39) [5]

А у Рихтера написано, что можно и не освобождать. Или освобождать сл. образом

HeapFree(GetProcessHeap(), 0, ppArgv);

А как лучше освобожадать, [7] или [8] ?

PS: не умею работать с памятью :-(


 
GuAV ©   (2005-11-29 01:41) [9]


> HeapFree(GetProcessHeap(), 0, ppArgv);

gdaujk ©   (27.11.05 0:53) [8]
Это может и так, но зачем использовать эту неочевидную конструкцию ? Так же можно освободить, например через LocalFree, но зачем ?
Если лень писать

> hMem := GlobalHandle(pTemp);
>  GlobalFree(hMem);

, то можно воспользоваться GlobalFreePtr.


> можно и не освобождать.

Можно. Память всё равно будет освобождена при выходе - тогда от процесса ничего не останется. Если функция вызывается небольшое и фиксированное число раз, утечка памяти не повредит.
Однако, если функция, не освобожадающая выделенную память, вызывается часто (например при рисовании или в Applicаtion.Idle, утечка может привести к потере производительности и неверной работе приожений.
Следить за тем, какая функция освобождает память, а какая нет и применять их соответственно - не очень хорошая идея. Хорошая идея - освобождать всё, что выделенно, и, по возможности, делать это в месте выделения. Особенно это касается разделяемых между модулями или процессами ресурсами.


 
GuAV ©   (2005-11-29 01:45) [10]

Кстати, gdaujk ©   (27.11.05 0:30) [7] - меня всё равно не устроило бы.
Код в

> aLines.Add(pArgs^);

- заранее неизвестный код пользователя или VCL, имеет право выбрасывать исключения, поэтому требуется освобождение в секции finally (for соотвественно в try).



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

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

Наверх





Память: 0.47 MB
Время: 0.012 c
3-1130793385
Erick
2005-11-01 00:16
2005.12.18
Как в Delphi работать с MS Access?


14-1132988205
Snap
2005-11-26 09:56
2005.12.18
Ненужная утилита


8-1121181725
MxQ
2005-07-12 19:22
2005.12.18
Управление воспроизведением звука


14-1132734051
rea
2005-11-23 11:20
2005.12.18
Семинар D2006


1-1132669205
Sandman29
2005-11-22 17:20
2005.12.18
CM_Hint Show обязателен?





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