Как я понял, четвертый параметр - это сколько байт считывать. Попробуй вместо sizeof(name) 40 например поставить.
в delphi не предусматривается такое, тут не задаете сколько байт лезет в этом числе, а задается отдельная - как бы переменная которая хранит некоторое колво байт от 1 до 4. 40 невозможно.
например 1- числа от 0 до 255, а 4 - от 0 до 4200000000+
Последний раз редактировалось Ginrey; 20.07.2012 в 13:34.
в delphi не предусматривается такое, тут не задаете сколько байт лезет в этом числе, а задается отдельная - как бы переменная которая хранит некоторое колво байт от 1 до 4. 40 невозможно.
например 1- числа от 0 до 255, а 4 - от 0 до 4200000000+
Ого ты его сам составлял или он с element.data вытаскивается ? И теперь додумать не могу как сделать . Если id = 6 например , то это "Крепкий клинок" . Как так для всех значений сделать то сразу?
открываеш этот items.txt, ищещ айди и выдераеш всё что после него + 1 байт ( : )
что-то типа
Код:
var
f:TextFile;
st:String;
.......
.......
assignfile(f,'items.txt');
reset(f);
while not EOF(f) do
begin
readln(f,st);
if pos('6'+':',st) = 1 then
showmessage(copy(st,pos(':',st)+1,length(st)));
end;
closefile(f);
вместо 6 любой другой айди предмета
как вариант сразу из pwdatabase выдрать можно, на форму кидаем tiddhttp
Код:
st:=idhttp1.get('http://www.pwdatabase.com/ru/items/6');
showmessage(utf8toansi(copy(st,
pos('<title>Perfect World Item Database - ',st)+37,
posex('</title>',st,pos('<title>Perfect World Item Database - ',st))-pos('<title>',st)-37)));
или как уже говорили необходимо всё это дело из items.txt загонять в массив
Код:
itemsarr: array[1..10] of String[10]=('вещь 1','вещь 2',вещь 3'..);
showmessage(itemsarr[2]) ;
но тут есть подводные камни
________________
ем мороженки
Последний раз редактировалось Nobody4all; 20.07.2012 в 15:27.
showmessage(utf8toansi(copy(st,
pos('<title>Perfect World Item Database - ',st)+37,
posex('</title>',st,pos('<title>Perfect World Item Database - ',st))-pos('<title>',
вариант не плох, но есть одно но, кодировка страницы и программы несколько не совпадают и я почти уверен, что если он так сделает получит вопросики или иероглифы какие то. поэтому лучше убрать utf8toansi вообще. Так же минус этой функции, получение кода страницы занимает не маленькое время, а так как ID в списке будет от 1 до 64 то затратится около минуты чтобы получить полный список имен предметов
Последний раз редактировалось Ginrey; 20.07.2012 в 16:17.
вариант не плох, но есть одно но, кодировка страницы и программы несколько не совпадают и я почти уверен, что если он так сделает получит вопросики или иероглифы какие то. поэтому лучше убрать utf8toansi вообще. Так же минус этой функции, получение кода страницы занимает не маленькое время, а так как ID в списке будет от 1 до 64 то затратится около минуты чтобы получить полный список имен предметов
перекодировку (utf8toansi) на то и поставил ибо иероглифы были про время да- всё зависит от канала, у меня подгружается страница около 2-3 секунд (3*64= 192 сек аля ~ 3 минуты). Впринципе если заюзать чистые сокеты, то можно добиться и быстрой работы, нежели используя инди
public static class ItemData
{
private static readonly Dictionary<int, string> Names = new Dictionary<int, string>();
private const string ItemFileDB = "items.txt";
static ItemData()
{
if (File.Exists(ItemFileDB))
{
var f = File.OpenText(ItemFileDB);
while (!f.EndOfStream)
{
var l = f.ReadLine().Split(new[] {':'}, 2);
try
{
Names.Add(int.Parse(l[0]), l[1]);
}
catch
{
}
}
f.Close();
}
}
public static string GetName(int id)
{
return Names.ContainsKey(id) ? Names[id] : String.Empty;
}
}
В начале считываем весь файл, а потом, в ходе работы вызываем функцию
ItemData.GetName(id), которая возвращает имя, если оно найдено в загруженном файле.
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]-cофт и прочее для комфортной игры в PW. PW Everyday Helper Bot
public static class ItemData
{
//Names - ассоциативный массив. В качестве ключей используем ID вещи, в качестве значения - имя предмета
private static readonly Dictionary<int, string> Names = new Dictionary<int, string>();
private const string ItemFileDB = "items.txt"; //Имя файла
static ItemData()
{
if (File.Exists(ItemFileDB)) //Если файл существует
{
var f = File.OpenText(ItemFileDB); //Открываем его на чтение как текстовый файл
while (!f.EndOfStream) //Пока не достигнут конец файла
{
var l = f.ReadLine().Split(new[] {':'}, 2); //Читаем строчку и разбиваем её в массив на две строчки. Разделитель - ':'
try //Мне лень делать нормальную проверку, поэтому просто оборачиваю дальнейший код в try catch, чтобы в случае чего программа не упала, а продолжила работу дальше
{
Names.Add(int.Parse(l[0]), l[1]); //Добавляем в Names значения.
//int.parse(l[0]) - это мы берем первую часть строчки (т.е. айди вещи) и приводим его к типу int
//l[1] - это вторая часть строчки - т.е. имя
}
catch //Пусть блок обработки исключения. Вообще оно не должно вызваться, если файл никто не менял
{
}
}
f.Close(); //Закрываем файл
}
}
public static string GetName(int id)
{
//Если в массиве есть элемент с индексом id, то возвращаем значение. Если нету - то пустую строку.
return Names.ContainsKey(id) ? Names[id] : String.Empty;
}
}
Добавлено через 2 минуты
В дельфи ассоциативный массив делается так, посмотри
[Ссылки могут видеть только зарегистрированные пользователи. ]
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]-cофт и прочее для комфортной игры в PW. PW Everyday Helper Bot
Последний раз редактировалось N00bSa1b0t; 21.07.2012 в 14:28.
Причина: Добавлено сообщение