Убедительная просьба ко всем, кто выкладывает исходники: 1. Обязательно пользуйтесь тэгом code (иначе очень трудно читать)
2. Старайтесь делать отступы
Если вы хотите чтобы вам помогли в написании программы, внятно излагайте задание!
Прежде чем задать вопрос, воспользуйтесь учебником
Возможно, что нужная вам программа уже написана, поэтому советую просмотреть список здесь и здесь Отредактировано куратором: Lord_of_Darkness. Дата: 07.07.2006 19:36
Member
Статус: Не в сети Регистрация: 04.04.2005 Откуда: Екатеринбург
В исходниках одной программы увидел, что настройки сделаны через классы, решил сделать подобным образом,
но почему-то не хочет работать.
Вот как я сделеал:
Код:
unit ProgramSettings;
interface
uses SysUtils,Forms,Windows,Classes,JvSimpleXml;
type TProgrammSettings = class; TSettingsForms = class; TSettingsMain = class;
TProgrammSettings = class(TObject) protected XML:TJvSimpleXml; FRoot:TJvSimpleXmlElem; public Forms:TSettingsForms;// настройки главного окна procedure LoadSettings;// загружаем настройки end;
TSettingsForms = class(TProgrammSettings) public Main:TSettingsMain; end;
procedure TProgrammSettings.LoadSettings; var CurItem: TJvSimpleXmlElem; function GetCurItem(const ItemName: string): TJvSimpleXmlElem; begin Result := CurItem.Items.ItemNamed[ItemName]; if Result = nil then begin Result := CurItem.Items.Add(ItemName); Result.Parent := CurItem; end; end; begin XML:=TJvSimpleXml.Create(nil); FRoot:=TJvSimpleXmlElem.Create(nil); FRoot:=XML.Root; XML.LoadFromString('<?xml version="1.0" encoding="windows-1251"?><WERTEX Version="strVersion" Date="08.12.2005"><Settings><Forms><Main Top="100" Left="100" Width="730" Height="500" /></Forms></Settings></WERTEX>'); CurItem:=FRoot; CurItem:=GetCurItem('Settings'); CurItem:=GetCurItem('Forms'); CurItem:=GetCurItem('Main'); with CurItem do begin Forms.Main.Top:=CurItem.Properties.IntValue('Top',0); Forms.Main.Left:=Properties.IntValue('Left',100); Forms.Main.Width:=Properties.IntValue('Width',740); Forms.Main.Height:=Properties.IntValue('Height',540); end; end; end.
Дак вот, возникает следующая ошибка: EAccessViolation. Как я понял это возникает из-за того, что классы TSettingsForms и TSettingsMain не создаютя.
Каким образом можно исправит эту ошибку ?
Последний раз редактировалось W[E]RTEX 10.12.2005 18:53, всего редактировалось 1 раз.
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
W[E]RTEX для начала использовать табуляцию при написании программ, написано отвратительно. Второе, что нужно сделать - почитать книги по ООП. Ну и третье - создавать экземпляр класса, перед его использованием.
Member
Статус: Не в сети Регистрация: 14.01.2004 Откуда: Киев, Украина
W[E]RTEX было бы еще видно, где ты из объявляешь и пользуешь, а так создание класса:
Код:
var SF: TSettingsForms . . . begin SF:=TSettingsForms.Create;
И я несовсем понимаю, зачем ради пары переменных создавать класс? Это только расход лишней памяти, проще их в структуру засунуть. А писал выше преведенный код, явно какой-то любитель Java, мол все - объект
Куратор темы Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
eldarovich88
Цитата:
Каким образом в паскале можно возвести число в степень, отличную от 2?? Например e в степени (a+b)
Все до жути просто! Вспоминаем св-ва логарифмов:
a^b=exp(b*ln(a))
можно использовать логарифм с любым основанием, но тогда вместо e надо возводить в степень соответствующее основанию число.
Используя эту зависимость можно возвести число в любую (даже дробную и отрицательную) степень, а т.ж. извлечь из него корень любой степени (что по сути тоже является возведением в степень, к примеру квадратный корень - это степень 0.5). Тут есть единственное ограничение - число, возводимое в степень (а) не может быть равно 0, но это легко обойти, используя if
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Куратор темы Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Для целых степеней:
Код:
function IntPow(num:real; power:integer):real; var i: integer; tmp: real; begin tmp:=1; if power>0 then begin for i:=1 to power do tmp:=tmp*num; end else if power<0 then begin for i:=1 to power do tmp:=tmp*num; tmp:=1/tmp; end
IntPow:=tmp; end;
для любых:
Код:
function AnyPow(num, power : real):real; var i: integer; tmp: real; begin tmp:=1; if num<>0 then begin tmp:=exp(power*ln(num)); end else tmp:=0; AnyPow:=tmp; end;
А так 7.12345^4.12345 до 7-го знака правильно считает, если с маткадом сравнивать. Расчет в маткаде с помощью встроенного возведения в степень (x^y):
Код:
3281.1504817173685
По моей формуле
Код:
3281.1504817173693
В паскале по моей формуле
Код:
3281.1504817000000
В дельфе
Код:
3281,1504817173700
Вполне приличная точность, правда смотря для каких задач...
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Куратор темы Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Daemon Тут как всегда проблема точность/скорость. Можно написать что-то подобное проге 9^99 с расчетом всех 95 знаков (писал давно, на ПС и на сайте у меня валяется), но к примеру эта прога считала 99^9999 примерно 10-15сек., это очень долго.
Если интересует данный вопрос - есть статья на delphiworld.narod.ru название - что-то про возведение в степень (поиск)
где-то тут. В любом случае там много интересного, правда для делфи (+asm), но и для паскаля покатит.
Добавлено спустя 6 минут, 12 секунд Ray Adams Вот и я о чем. Непонятно какой именно стандарт имел ввиду Daemon eldarovich88 Всегда пожалуйста
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Куратор темы Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Daemon ok, есть другие предложения? Можно еще через степень 2-ки сделать и через логарифм по основанию 2. Точность и скорость должны возрасти, зато сложность функции (для написания) тоже повысится. Думаю в данном случае предложенный мной вариант вполне подойдет.
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Куратор темы Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
eldarovich88 Ну типа инициализировать то графический режим можешь?
А рисуется просто PutPixel(Random(разрешение_по_горизонтали),Random(разрешение_по_вертикали),_цвет_)
и все это в цикле, длиной в зависимости от количества точек.
Если сложно, отпишись, накидаю сырец
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Lord_of_Darkness у меня такой ролик, значит: синее небо, на котором собираюсь зделать звезды, земля, на которой стоит чувак и его дом. Летит комета, оставляя за собой красно-желтый шлейф и врезается в дом. Осталось добавить звезды и анимацию чувака. Добавлено спустя 1 час, 34 минуты, 6 секунд Сделал звезды, спасибо за подсказку! Добавлено спустя 1 минуту, 23 секунды А, еще вопрос, как выводить изображение в разных режимах последовательно? Например сначала normalput, ролик закончился, потом заного начался, но уже xorput т.д.?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения