Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 892
от 11.08.2007, 21:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 466, Экспертов: 75
В номере:Вопросов: 5, Ответов: 20


Вопрос № 97454: Здравствуйте! у меня такой вопрос: Я вывожу в ListBox список полных имён файлов и по завершении программы запоминаю выбранный в ini файле, так вот пока имена короткие(<255) проблем не возникает а если больше?? Подскажите как можно выве...
Вопрос № 97496: ув. эксперты. я пишу программу и хочу сделать так, чтобы пользователь мог сам выбрать оформление(шрифт формы, цвет формы), но не знаю как пишется процедура сохранения шрифта и цвета формы. в программу заходишь, выбираешь оформление(шрифт, цвет), пото...
Вопрос № 97526: RaveReports 5 to RaveReports7. Есть уже написанные отчеты в 5-ой версии Rave Reports. Но есть проблемы с отображением русских текстов. Знаю, как решить ее , но надо лезть в реестр и править - половинчатое решение. Проверил - в 7-ой версии Rave этот в...
Вопрос № 97527: Здравствуйте! У меня такая проблемка: в программе надо получить данные из ListBox, занеся строку из листбокса в строковую переменную. При вызове ShowMessage(ListBox1.Items[1]); всё проходит нормально, а при tmp:=ListBox1.Items[i]; (tmp:ansistring...
Вопрос № 97531: Здравствуйте эксперты! Скажите, почему у меня этот код не запускается – постоянно выделяется Result. ..

Вопрос № 97.454
Здравствуйте!
у меня такой вопрос:
Я вывожу в ListBox список полных имён файлов и по завершении программы запоминаю выбранный в ini файле, так вот пока имена короткие(<255) проблем не возникает а если больше??
Подскажите как можно вывести такие имена в ListBox(желательно) и под каким типом сохранять такую длинную переменную в инишник или способ чтоб её как нить запомнить.
Заранее СПАСИБО!
Отправлен: 06.08.2007, 07:14
Вопрос задал: Stari (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: Delph
Здравствуйте, Stari!

Сохранение данных в файле:

ListBox1.Items.SaveToFile('ListBox.txt');

Чтение из файла:

ListBox1.Items.Clear;
ListBox1.Items.LoadFromFile('ListBox.txt');

Вместо 'ListBox.txt' Вы можете подставить любое имя для файла, которое Вас устроит.

------------------------------------------------------------------------------------

sir henry! Думаю, что Вы не совсем правы. Я сам попробовал код, который только что привёл, при длинах строк несколько больше 300 символов. Возможно, имеет значение версия Delphi, но моя Delphi 7 отработала корректно.
Ответ отправил: Delph (статус: 5-ый класс)
Ответ отправлен: 06.08.2007, 09:48
Оценка за ответ: 5

Отвечает: Mishell
Здравствуйте, Stari!
запоминайте строку (или строки) в обычный текстовый файл - в них нет ограничений
а в ListBox строки длиной более 255 символов добавляются без проблем (проверил)
Ответ отправил: Mishell (статус: 4-ый класс)
Ответ отправлен: 06.08.2007, 11:19
Оценка за ответ: 4
Комментарий оценки:
текстовые файлы не совсем корректное решение(хотя делать придётся скорее всего через него),хотелось как можно больше централизовать все настройки и хранение всех данных

Отвечает: Василенко Алексей Васильевич
Здравствуйте, Stari!
возможным решением Вашей проблемы может служить AnsiString(~2^31 characters).
записать в переменную полное имя файла получиться, сохранить в ини-файле возможно тоже(на практике не доводилось). Возникнет проблема при работе с listBox'ом, т.к. он массив String'ов.. возможное решение - вывод нескольких строк или ввод псевдонимов, сокращение отображаемой части имени.
Конечное решение за Вами. т.к. не зная постановки задачи советовать что-то конкретное очень сложно.
P.S.: Возможно целесообразнее ограничить возможную длину имени файла?
---------
Готовых решений небыло, нет и не будет... вся жизнь - это лишь размышления на тему
Ответ отправил: Василенко Алексей Васильевич (статус: 5-ый класс)
Ответ отправлен: 07.08.2007, 00:18
Оценка за ответ: 5


Вопрос № 97.496
ув. эксперты. я пишу программу и хочу сделать так, чтобы пользователь мог сам выбрать оформление(шрифт формы, цвет формы), но не знаю как пишется процедура сохранения шрифта и цвета формы. в программу заходишь, выбираешь оформление(шрифт, цвет), потом заходиш 2ой раз, твоих изменений уже нет, скажите плизз как это исправить?
Заранее огромное спасибо.
всем за ответы отлично.
Отправлен: 06.08.2007, 13:43
Вопрос задал: Патрикеев Сергей (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Дмитрий С.
Здравствуйте, Патрикеев Сергей!
советую сохранять выбранные параметры в реестре или .ini файле.
---------
Наши программисты самые программистые программисты!..
Ответ отправил: Дмитрий С. (статус: 3-ий класс)
Ответ отправлен: 06.08.2007, 13:50
Оценка за ответ: 5

Отвечает: Stari
Здравствуйте, Патрикеев Сергей!
можно сохранять результаты изменения шрафта в ini-файл
Ответ отправил: Stari (статус: 1-ый класс)
Ответ отправлен: 06.08.2007, 13:50
Оценка за ответ: 1

Отвечает: Shveps
Здравствуйте, Патрикеев Сергей!
Есть 2 варианта, возможно кто-то предложит ещё - это воспользоваться записью данных о шрифтах в реестр или организовать запись данных в ini файл.
В первом случае можно организовать "вручную" процедуру, которая будет записывать данные в реестр или воспользоваться RXFormStorage из пакета компонентов RX, если найдете эти компоненты. В приложении я привел несколько строчек кода для работы с реестром.
Во втром случае код приведен внизу, который как раз решает вашу проблему ;)

Приложение:

---------
Пиво ф топку !!! Водку Тоже !!!

Ответ отправил: Shveps (статус: 7-ой класс)
Ответ отправлен: 06.08.2007, 14:01
Оценка за ответ: 5

Отвечает: Mishell
Здравствуйте, Патрикеев Сергей!
сохранять оформление можно например в ini-файлы:
uses IniFiles;
...
var ini:TIniFile;
...
// сохраянем данные - например в OnClose
ini:=TIniFile.Create('c:myprojectsettings.ini'); // имя файла задавайте своё
ini.WriteString('Form1','FontName',Form1.Font.Name);
ini.WriteInteger('Form1','FontSize',Form1.Font.Size);
ini.WriteString('Form1','FontColor',ColorToString(Form1.Font.Color));
ini.WriteString('Form1','Color',ColorToString(Form1.Color));
ini.Free;
...
// восстанавливаем сохраненные данные - например в OnCreate
ini:=TIniFile.Create('c:myprojectsettings.ini');
Form1.Font.Name:=ini.ReadString('Form1','FontName','Arial');
Form1.Font.Size:=ini.ReadInteger('Form1','FontSize',8);
Form1.Font.Color:=StringToColor(ini.ReadString('Form1','FontColor','clBlack'));
Form1.Color:=StringToColor(ini.ReadString('Form1','Color','clBtnFace'));
ini.Free;

или можно все это хранить в реестре - см. хелп по классу TRegistry
Ответ отправил: Mishell (статус: 4-ый класс)
Ответ отправлен: 06.08.2007, 14:14
Оценка за ответ: 5

Отвечает: Bochvarov NikB
Здравствуйте, Патрикеев Сергей!
Смотриш свойства обектов (примерно tFont: Style, Name и т.д.) и записьиваш их в Registry.
Потом читаеш и ставиш на оборот.
Ответ отправил: Bochvarov NikB (статус: 10-ый класс)
Ответ отправлен: 06.08.2007, 14:20
Оценка за ответ: 3
Комментарий оценки:
я просил саму процедуру


Вопрос № 97.526
RaveReports 5 to RaveReports7. Есть уже написанные отчеты в 5-ой версии Rave Reports. Но есть проблемы с отображением русских текстов. Знаю, как решить ее , но надо лезть в реестр и править - половинчатое решение. Проверил - в 7-ой версии Rave этот вопрос решен. ПРОБЛЕМА след-я: как новая версии не понимает старый формат файлов *.rav. Как старый формат конвертануть в новый???
Отправлен: 06.08.2007, 17:09
Вопрос задал: Splender Alex (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лукьяненко Алексей Валериевич
Здравствуйте, Splender Alex!

Rave 7 точно понимает формат отчета от 6 версии. Проблем при переходе от 5 версии к 6 тоже не помню. Так что как вариант - скачать с сайта производителя демку 6 версии, открыть ею отчеты от 5, сохранить и работать с ними уже в 7.
Ответ отправил: Лукьяненко Алексей Валериевич (статус: 9-ый класс)
Ответ отправлен: 06.08.2007, 17:37


Вопрос № 97.527
Здравствуйте!
У меня такая проблемка: в программе надо получить данные из ListBox, занеся строку из листбокса в строковую переменную. При вызове ShowMessage(ListBox1.Items[1]); всё проходит нормально, а при tmp:=ListBox1.Items[i]; (tmp:ansistring;) программа рушится. Никак не могу понять в чем дело :(
Отправлен: 06.08.2007, 17:27
Вопрос задал: Фролов Павел Сергеевич (статус: Посетитель)
Всего ответов: 7
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: Решетник Д
Здравствуйте, Фролов Павел Сергеевич!
Я так думаю, что проблема в индексе i. возможно, вы перебираете элементы от 1 до count
а нужно for i := 0 to lb.count-1 do ...
С переменными проблем не должно быть. ведь все автоматом выделяется...
---------
Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: Студент)
Ответ отправлен: 06.08.2007, 17:40
Оценка за ответ: 4

Отвечает: Mishell
Здравствуйте, Фролов Павел Сергеевич!
для переменной i надо чтобы выполнялись условия: i>=0 и i<ListBox1.Items.Count
т.е. если Вы выполняете присвоение в цикле - то надо так:
for i:=0 to ListBox1.Items.Count-1 do
begin
tmp:=ListBox1.Items[i];
...
end;
Ответ отправил: Mishell (статус: 4-ый класс)
Ответ отправлен: 06.08.2007, 17:58

Отвечает: Виктор Пырлик
Здравствуйте, Фролов Павел Сергеевич!

Вы не расшифровали "рушится". Из приведенного вами, можно предположить, что вы выходите за границу массива (количество Items).
максимум для переменной i цикла должен быть на единицу меньше количества Items - пример в приложении.
ListBox1.Items[ListBox1.Items.Count] <- ошибка
ListBox1.Items[ListBox1.Items.Count-1] <- верно

Приложение:

---------
Если ничего не помогло - надо читать инструкцию

Ответ отправил: Виктор Пырлик (статус: Студент)
Ответ отправлен: 06.08.2007, 18:56

Отвечает: Василенко Алексей Васильевич
Здравствуйте, Фролов Павел Сергеевич!
чесно говоря, Павел, я написал нижеприведенную процедуру.... и НИСЛОВА от компилятора ни услышал... про запуске получил в сообщениях все элементы листбокса.

Изложите пожалуйста фразу "программ рушиться" по подробнее...

Приложение:

---------
Готовых решений небыло, нет и не будет... вся жизнь - это лишь размышления на тему

Ответ отправил: Василенко Алексей Васильевич (статус: 5-ый класс)
Ответ отправлен: 06.08.2007, 23:30

Отвечает: Stari
Здравствуйте, Фролов Павел Сергеевич!
а если попробовать так:
tmp := ansistring(ListBox1.Items[i]);
Ответ отправил: Stari (статус: 1-ый класс)
Ответ отправлен: 07.08.2007, 07:13

Отвечает: Дмитрий С.
Здравствуйте, Фролов Павел Сергеевич!
В своём посте Вы не указываете явно что представляет из себя переменная "i". Могу предположить, что текст программы должен выглядеть следующим образом:

const n = 10; // for example
var i: integer;
{-------------}

begin
{-------------}
for i:=1 to n do
tmp := ListBox1.Items[i];
{-------------}
end;
---------
Наши программисты самые программистые программисты!..
Ответ отправил: Дмитрий С. (статус: 3-ий класс)
Ответ отправлен: 07.08.2007, 14:28

Отвечает: Busmatch
Здравствуйте, Фролов Павел Сергеевич!
код работает, возможно проблемы с tmp перекрытие локальными переменными

Приложение:

Ответ отправил: Busmatch (статус: 1-ый класс)
Ответ отправлен: 07.08.2007, 18:37


Вопрос № 97.531
Здравствуйте эксперты! Скажите, почему у меня этот код не запускается – постоянно выделяется Result.

Приложение:

Отправлен: 06.08.2007, 18:40
Вопрос задала: Алена (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Mishell
Здравствуйте, Алена!
в конце строки
For i:= Length (s) downto 1
не хватает оператора do
т.е. надо вот так:
For i:= Length (s) downto 1 do

кстати внимательней смотрите за сообщениями об ошибках - Дельфи Вам выдало ответ на Ваш вопрос сразу:
[Error] ... : 'DO' expected but identifier 'Result' found
Ответ отправил: Mishell (статус: 4-ый класс)
Ответ отправлен: 06.08.2007, 18:55
Оценка за ответ: 5

Отвечает: Виктор Пырлик
Здравствуйте, Алена!

Вы пропустили оператор do

For i:= Length (s) downto 1 do
Result:= Result + s[i];

---------
Если ничего не помогло - надо читать инструкцию
Ответ отправил: Виктор Пырлик (статус: Студент)
Ответ отправлен: 06.08.2007, 19:12
Оценка за ответ: 5

Отвечает: Василенко Алексей Васильевич
Здравствуйте, Алена!
допущена ошибка в описании цикла for

Приложение:

---------
Готовых решений небыло, нет и не будет... вся жизнь - это лишь размышления на тему

Ответ отправил: Василенко Алексей Васильевич (статус: 5-ый класс)
Ответ отправлен: 06.08.2007, 23:21
Оценка за ответ: 5

Отвечает: Дмитрий С.
Здравствуйте, Алена!
В приведённом Вами листинге не хватало "do" в цикле FOR. Исправленный код в приложении.

Приложение:

---------
Наши программисты самые программистые программисты!..

Ответ отправил: Дмитрий С. (статус: 3-ий класс)
Ответ отправлен: 07.08.2007, 14:22
Оценка за ответ: 5


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.54 beta от 01.08.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное