слушай , если знаешь какой оофсет дает статы шмотки например после крафта получить параметры вещи на аспид. если все верно оставляю если нет выбрасываю
N00bSa1b0t, я бы не так в делфи сделал. Зачем загонять файл в массив, когда можно работать с ним напрямую?
Код:
function GetName(filename,id:string):string;
var
f:TextFile;
s,s1:string;
begin
result:='';
if Pos('.txt',filename)<>0 then //1
begin
AssignFile(f,filename);
end
else
begin
Exit;
end;
Reset(f);
while not Eof(f) do
begin
ReadLn(f,s);
if Pos(id+':',s)<>0 then //2
begin
s1:=Copy(s,0,Pos(':',s)-1);
if Length(s1)=Length(id) then //3
begin
s:=Copy(s,Pos(':',s)+1,Length(s)-Pos(':',s)+1);
result:=s;
CloseFile(f);
Exit;
end;
end;
end;
CloseFile(f);
end;
Как видишь, в коде я условия отметил цифрами. Сейчас объясню какое условие для чего предназначено:
1: Условие, по сути, не даёт выполнится функции, если в неё засунули путь не к текстовому файлу.
2: Условие проверяет наличие нужного тебе id в списке.
3: Если будет искаться id "777777" и функция попадёт на строку с id "7777777", то, без этого условия, название предмета выведется не с того id.
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Ginrey, а нафига в массив заносить? У тебя есть файл, в котором id записаны в виде id:name. Ты просто передаёшь в программу путь к файлу и нужный тебе id. Допустим в папке с твоей программой есть файл id.txt и найти тебе нужно название предмета с id 123456 в переменную s2:string, тогда это будет выглядеть так:
Код:
s2:=GetName('id.txt','123456');
В итоге имя предмета по этим id будет в переменной s2.
P.S. Если тебе нужно находить название нескольких предметов сразу, то могу немножко дописать функцию
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Ginrey, а нафига в массив заносить? У тебя есть файл, в котором id записаны в виде id:name. Ты просто передаёшь в программу путь к файлу и нужный тебе id. Допустим в папке с твоей программой есть файл id.txt и найти тебе нужно название предмета с id 123456 в переменную s2:string, тогда это будет выглядеть так:
Код:
s2:=GetName('id.txt','123456');
В итоге имя предмета по этим id будет в переменной s2.
P.S. Если тебе нужно находить название нескольких предметов сразу, то могу немножко дописать функцию
допиши пожалуйста. и срау такой вопрос. а если я нехочу чтобы был текстовый файл, а хочу сразу чтобы все данные были в программе. например в листбокс
если я нехочу чтобы был текстовый файл, а хочу сразу чтобы все данные были в программе. например в листбокс
Тогда смысла от моего кода нету, всё и так лежит в памяти, работай тогда уже с ней напрямую. Но если ты в ListBox всё равно с файла читаешь, то я тебя не понимаю...
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Тогда смысла от моего кода нету, всё и так лежит в памяти, работай тогда уже с ней напрямую. Но если ты в ListBox всё равно с файла читаешь, то я тебя не понимаю...
ну смотри, что я хочу. имена и ID я могу вырезать, но это занимает секунд 30 работы программы. вот и хочу знать как ускорить
Хм, ты с elments.data парсишь перед запуском? Создай уже готовую базу и читай с неё
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Отрыл в недрах винчестера мой код. Немного приспособил под твой случай. Ну тут код - голову свернёшь, обьяснять долго, да и понять трудно. Ладно, попробую.
function PosX(a:TArrayOfString; s:string; var i:integer):boolean;
var
j:integer;
begin
result:=False;
for j:=0 to High(a) do
begin
if Pos(a[j]+':',s)<>0 then
begin
result:=True;
i:=j;
Exit;
end;
end;
end;
Сразу прошу прощение, в памяти я храню всё в массивах, так что для того, чтобы вывести в ListBox нужно будет, или подганять функцию под TStrings, или перегонять в него информацию из массива, в который читать результат моей функции, циклом.
Сам код:
Код:
function GetNamesById(source,id:TArrayOfString):TArrayOfString;
var
i,c,x:integer;
s,s1:string;
begin
SetLength(result,High(id)+1);
x:=0;
c:=0;
for i:=0 to High(source) do
begin
s:=source[i];
if PosX(id,s,c) then
begin
s1:=Copy(s,0,Pos(':',s)-1);
if Length(s1)=Length(id[c]) then
begin
result[x]:=s;
if x=High(id) then
begin
Exit;
end;
inc(x);
end;
end;
end;
end;
function GetNames(filename:string; id:TArrayOfString):TArrayOfString;
var
f:TextFile;
s,s1:string;
c,x:integer;
begin
if Pos('.txt',filename)<>0 then
begin
AssignFile(f,filename);
end
else
begin
Exit;
end;
SetLength(result,High(id)+1);
c:=0;
x:=0;
Reset(f);
while not Eof(f) do
begin
ReadLn(f,s);
if PosX(id,s,c) then
begin
s1:=Copy(s,0,Pos(':',s)-1);
if Length(s1)=Length(id[c]) then
begin
result[x]:=s;
if x=High(id) then
begin
CloseFile(f);
Exit;
end;
inc(x);
end;
end;
end;
CloseFile(f);
end;
Оба кода в результате выведут в массив строки вида id:name. Почему так? А потому что в функцию ты засовываешь список из нескольких id и правильнее будет вывести их с именами именно в таком виде.
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
в delphi не предусматривается такое, тут не задаете сколько байт лезет в этом числе, а задается отдельная - как бы переменная которая хранит некоторое колво байт от 1 до 4. 40 невозможно.
например 1- числа от 0 до 255, а 4 - от 0 до 4200000000+
Кажется мне это ерунда, вместо sizeof(name) именно количество считанных байт записывается, а в переменной они или прямым значением не имеет разницы. Ведь sizeof это не переменная а оператор, возвращающит значение типа int. А не считывалось по одной простой причине, name:wchar; не массив а 1 двухбайтный символ, потому считывалось 2 байта(soxeof(name)=sizeof(wchar)=2)
спасибо за код. но щас не могу проверить. днюху отмечаем, когда никогда к компу подхожу отвечаю. завтра проверю
Цитата:
Сообщение от dwa83
Кажется мне это ерунда, вместо sizeof(name) именно количество считанных байт записывается, а в переменной они или прямым значением не имеет разницы. Ведь sizeof это не переменная а оператор, возвращающит значение типа int. А не считывалось по одной простой причине, name:wchar; не массив а 1 двухбайтный символ, потому считывалось 2 байта(soxeof(name)=sizeof(wchar)=2)
как раз sizeof ghdthztn на кол-во байт в строке и сама подбирает оптимальную переменную
как раз sizeof ghdthztn на кол-во байт в строке и сама подбирает оптимальную переменную
Ну ёлки палки, sizeof - оператор, действие которого приводит к появлению в коде значения типа Int, которое получается в зависимости длинны в байтах простого или составного типа, либо длинны в байтах переменной этого типа.
операция sizeof("ghdthztn") вернёт ЗНАЧЕНИЕ типа int, которое будет равно количеству байт, которое занимает в памяти переменная, в данном случае строки(константную строку не переменной длины можно представить как массив символов - составной тип данных из нескольких стандартных Char)
так считываться будут только 2 байта
а так 8 байт
О чём говорит к примеру вот такая строка?
WriteProcessMemory(hProcess, AllocBuffer, PChar(LibName), length(LibName)+1, BytesWritten)
Или length(LibName)+1 тоже подбирает тип возвращаемого значения? она возвращает значение уже определённого типа INT, и если значение будет 255, то никак не BYTE, а INT = 255;
А вообще извиняюсь, что не по теме
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 22.07.2012 в 01:20.