Записал строковую переменную в конец каждой строки файла: st.q1 st.q2 st.org_name 100 200 орагнизация1 200 210 орагнизация2 ...
Begin Reset(F1); //открываю файл для чтения Read(F1,???); //Здесь я должен прочитать из файла строковую переменную. Что мне нужно написать //вместо вопросов? while not EOLN do // begin if st.org_name='RUS' then //И если она(строковая переменная) равно 'RUS', то изменить Caption у GroupBox2. GroupBox2.Caption:='text'; CloseFile(F1); end; end;
Вместо вопросов нужно писать программы :) - шютка. Пиши так:
while not EOF(F1) do // begin ReadLn(F1, st.q1, st.q2, st.org_name); if st.org_name='RUS' then //И если она(строковая переменная) равно 'RUS', то изменить Caption у GroupBox2. GroupBox2.Caption:='text'; end; CloseFile(F1);
Ответ отправлен: 13.12.2002, 11:46 Отправитель: Артём Отвечает Idle Sign
Добрый день, Tik! ===== Pro bono publico, no bloody panico! ===== Если файл задан как тестовой, используй ReadLn. В любом случае вместо вопросов подставляется переменная(ые), в которую будет происходить считывание. Read будет читать по одному символу, ReadLn строку. Теперь пишешь процедуру парсинга (отсекаешь ненужные начальные циферки), и то что у тебя от строки осталось сравниваешь. Ответ отправлен: 13.12.2002, 12:13 Отправитель: Idle Sign
Вопрос № 347
Привет! Народ, помогите! Пишу редактор WAD-файлов(кто не знает - DOOMовские файлы ресурсов), не получаются самые элементарные вещи :( Очень надеюсь на вашу помощь. 1) Пробовал создать динамический массив и потом загрузить в него файл через Blockread: Data : array of byte; f : File of byte; ... assignfile(f,'..zdoom2.wad');reset(f); WadSize := FileSize(F); blockread(F,data,Wadsize); closefile(f); Но не работает, пишет "Access violation...". Вероятно это от того, что массив Data в памяти распологается не одним куском, а по частям. Можно как-нибудь заставить его выделить память куском? 2) Вот есть у меня массив 20000001 элемента(не динамический). Мне надо начиная с некоторого элемента номер x сдвинуть массив влево или вправо на y. Я пытался сделать это так: out1,out2 : pointer; data
: array[0..20000000] of byte; ... Out1 := ptr(integer(addr(Data))+x); Out2 := ptr(integer(addr(Data))+x+y); Out2^ := Out1^; Но это, как и ожидалось, не сработало. Причем Out1 и Out2 получают правильные адреса. Пытался использовать PChar, но там копирует до первого нуля. Есть ли какая-нибудь процедура, чтобы сделать это? Побайтовый проход через For не подойдет - слишком медленно. Заранее спасибо всем, кто ответит!
Здравствуйте, Necro! 1. Перед BlockRead, ты забыл выделить память массиву Data: SetLength(Data, WadSize); а то ты объявил динамический массив, а размера у него нет, данные помещать некуда. 2. И не будет работать, потому-что ты получаеш адрес, а потом прибавляешь к адресу х(у), т.е. в результате получаешь указатель неизвестно на что. Представь, что твой знакомый проживает по адресу: Красная площадь, дом 1. От того, что ты прибавишь к адресу 1 или 2, твой знакомый не очутится ни в доме №2, ни в дом №3. Его для этого нужно физически переместить. Поскольку через For нельзя, предлагать решение не буду. Обратись к экспертам по асм'у, скорость выполнения - это их преррогатива.
Ответ отправлен: 15.12.2002, 06:14 Отправитель: Vadim Отвечает Melkor
Здравствуйте, Necro! 1)Попробуй создать указатель и проинициализировать его нужным размером (см. приложение). 2)Может помочь функция WinAPI, кот. перемещает блок памяти: MoveMemory(Dest: Pointer; Source: Pointer; Length: DWord); Dest - куда копировать Source - откуда копировать Length - длинна в байтах
Приложение: Ответ отправлен: 14.12.2002, 02:02 Отправитель: Melkor Отвечает Jadd
Добрый день, Necro! 1)Ты ерунду пишешь. Ерунда в том месте, где говорится про какие-то куски в памяти. Ошибка вываливается абсолютно правильно. То, чно у тебя написано(в проге), говорит об ОБЪЯВЛЕНИИ динамического массива. Но!!! Его надо разместить в памяти, т.е. выделить ровно столько памяти, сколько требуется для размещения там массива. Значит, надо определить размер массива. для этого есть в дельфях функция SetSize (по-моему так). Читай внимательно хелп в дельфях, особенно тот раздел, где говорится про динамические массивы. А еще неплохо было бы прочитать тебе про адрессацию и прочую организацию памяти в компе, а так же про управление памятью в винде. Просто СРОЧНО! 2)Ты хочешь, чтобы нашелся метод для сдвига блока памяти размером около 20-ти МЕГА? Причем быстро? Так не бывает. Пиши for и не морочь никому голову. И еще. Не стоит использовать такие блоки
памяти в работе - это неоправдано. Прими это как совет опытного программера с многолетним стажем. Задач с такими требованиями в природе просто нет! К тому же, приведенный кусок кода имеет недостатки и не выполняет целиком поставленной задачи. Ответ отправлен: 15.12.2002, 03:38 Отправитель: Jadd Отвечает toshka
Здравствуйте, Necro! >> WadSize := FileSize(F); Тут надо вставить: SetLength(data, WADSize); // т.к. динамический массив изначально не имеет размера >> blockread(F,data[0],Wadsize); // Надо читать данные ИМЕННО в data[0], поскольку data - это УКАЗАТЕЛЬ на массив Чтобы сдвинуть массив, надо использовать следующую конструкцию: Move(data[x], data[x+y], 1000) // Перенос с позиции X на смещение Y, 1000 элементов массива Ответ отправлен: 15.12.2002, 09:53 Отправитель: toshka
Вопрос № 348
Приветствую вас эксперты. Такое дело, необходимо из программы запустить свойства "Мой компьютер", закладка "Оборудование", и вообще где надыбать как запускать другие Виндовские прибамбасы :)? Ответьте подробнее, очень надо!!
Здравствуйте, Iv! Что ты понимаешь под понятием "Виндозовские прибамбасы" ? Ответ отправлен: 15.12.2002, 09:55 Отправитель: toshka
Вопрос № 349
Доброго времени суток всем экспертам! Подскажите пожауйста, как работая с документом Excell в дельфи можно обратиться к конкретной ячейке таблицы. Спасибо!
Здравствуйте, Pervert! Можно натаскать компонентов с панели инструментов Delphi. Начиная, по-моему, с 5 версии, в Delphi есть компоненты для всего офиса (ворд, ексель и т.д.). Для начала это, пожалуй, будет лучше всего, т.к. Delphi тебя будет обеспечивать подсказкой, какие методы и свойства у них есть, а каких нету. Можно писать все вручную, что-то типа: var ExApp: Variant; begin ExApp:=CreateOLEObject('Excel.Application'); ... ExApp.WorkBook.Range('A1:D10').Cell(1,1).Value:='Что тебе надо занести в ячейку'; и далее работаешь как с обычными классами. Но надо, чтобы под рукой была справка по VBA (из офиса).
Ответ отправлен: 15.12.2002, 08:54 Отправитель: Vadim
Вопрос № 350
Здарова экспертам. Помогите начать, ну всмысле хочу написать самую простую прогу на самом простом языке (все делают и ...) Я в этом деле полный ламер. Слышал тока что delphi типа "любительский". Мож чо почитать (всмысле не книжку а напр file.pdf...) или посмотреть
Добрый день, Dr.M()rG! По-моему, лучше все-таки книжку. Пока еще не все сознательные граждане приобрели компутер с двумя мониторами, поэтому с книжкой удобнее :)). Можно заглянуть на сайт delphi.mastak.ru, там куча статеек по всяким вопросам, куча ссылок, примеров и т.д. Можно зайти на soobcha.ru/rushelp, там как раз есть статейка для начинающих и всякие примеры. Ответ отправлен: 15.12.2002, 09:05 Отправитель: Vadim Отвечает Idle Sign
Здравствуйте, Dr.M()rG! На мой взгляд самый простой язык - Visual Basic. Делфи вовсе не любительский язык - на нем пишутся и профессиональные приложения. Все доло в руках программиста. А насчет докумов - лезь в любой поисковик и пиши Delphi. Изучай, пиши, совершенствуй . . . Ответ отправлен: 14.12.2002, 20:43 Отправитель: Pinman Отвечает Melkor
Добрый день, Dr.M()rG! На самом деле Delphi не любительский язык, если нужен простой язык - пиши на каком-нидудь Microsoft Visual Basik или что-нибудь в этом роде. А про Delphi можешь почитать на каком-нибудь сайте (напр. http://delphi.mastak.ru/). Ответ отправлен: 15.12.2002, 01:46 Отправитель: Melkor
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.