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

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


Информационный Канал Subscribe.Ru

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

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

Выпуск № 310
от 30.11.2005, 15:24

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


Вопрос № 30150: Здаствуйте,эксперты! Огромное вам спасибо за IFPS3, это то что было нужно,вещь ОфигеннАя!!! У меня теперь такие вопросы: 1) В каком формате лучше зделать файлы(html,doc и т.д.),которые в будушем должны будут динамически загружатЬся на фор...
Вопрос № 30156: Привет знатоки. Приложение вызывает ошибку Project SCAD.exe raised exeption class EAccessViolation with message 'Access violation at address 00404ABA in module SCAD.exe' Read address 0000000C'. Process stoped. Как найти строку кода вызвавшег...
Вопрос № 30158: Здравствуйте уважаемые эксперты. Вот код процедуры, в указанном месте которой вылетает ошибка(Access violantion at adress 004036F4 in module 'primer.exe'. Read of adress FFFFFFFC). Не могу понять почему?! P.S. Во время работы программы эта пр...
Вопрос № 30198: Уважаемы эксперты. Хотелось бы задать вам очень хитрый вопрос: У меня на компьютере стоит домашний сервер Apache (для PHP,MySQL) в составе Denera (http://www.dklab.ru/). Ну так вот вопрос. Как с помощью Delphi 7 можно соединится с MySQl серве...
Вопрос № 30199: Пытался написать программу которая, если запоминает шрифт объкта Tmemo в файл,а при следующем запуске использует его. Но почему-то она не работает. В приложении сокращенный листинг программы. Помогите я уже измучался!...

Вопрос № 30.150
Здаствуйте,эксперты!
Огромное вам спасибо за IFPS3, это то что было нужно,вещь ОфигеннАя!!!
У меня теперь такие вопросы:
1) В каком формате лучше зделать файлы(html,doc и т.д.),которые в будушем должны будут динамически загружатЬся на форму(понятно то что в разные компоненты)Файлы содержат Текст-разного форматирования,картинки!
2)как отрыть doc-файл(MS word) в каком либо компоненте.Файл содержит текст-разного форматирования,картинки,блок-схемы! Что бы этот текст можно было читать смотреть картинки,но не редактировать!
Пожалуйста поподробней! Заранее Огромное спасибо!!!
Отправлен: 24.11.2005, 18:13
Вопрос задал: chikanok (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Маренич Владимир
Здравствуйте, chikanok!
За IFPS3 пожалуйста и спасибо автору :)
1) Если HTML, то нужно еще и картинки к нему хранить - в сам HTML картинки не интегрируются (в этом минус). Но зато можно его очень просто отображать используя TWebBrowser (это плюс). DOC'и придется отображать в TOleContainer (при этом должен быть установлен MS Office на машине, где будет работать программа). Выбирать Вам.
2) Для просмотра вордовского файла используйте TOleContainer:
OleContainer1.LoadFromFile(OpenDialog1.FileName)
Ответ отправил: Маренич Владимир (статус: 7-ой класс)
Отправлен: 25.11.2005, 10:23


Вопрос № 30.156
Привет знатоки. Приложение вызывает ошибку
Project SCAD.exe raised exeption class EAccessViolation with message 'Access violation at address 00404ABA in module SCAD.exe' Read address 0000000C'. Process stoped.
Как найти строку кода вызвавшего ошибку? Можно ли по адресу 00404ABA его найти?
Отправлен: 24.11.2005, 18:49
Вопрос задал: Березуев Роман Иванович (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 15)

Отвечает: Jadd
Здравствуйте, Березуев Роман Иванович!
Поставь точку останова в начале процедуры, в которой происходит ошибка и оттрассируй стоорку за строкой. Посмотри какие переменные какие значения получают. Где объекты инициализируются. Нету ли попытки обращения к невыделенным областям памяти или к непроинициализированным объектам. Ну и тп. Если не найдешь, давай мне, я разберусь.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 24.11.2005, 18:57
Оценка за ответ: 4
Комментарий оценки:
Спасибо за поддержку. В том то и была проблема - определить хотябы приблизительно процедуру, не говоря уже о строке кода. Строк 6624 в программе. Пришлось помучаться. Но все же интересно, неужели все те числа что при ошибке сообщаються совершенно бесполезные?

Отвечает: sir henry
Здравствуйте, Березуев Роман Иванович!
Нет нельзя. Ведь окомпилированая программа это набор нулей и едениц.
У Вас должны быть под рукой исходники. Запускайте программу в IDE и она Вам покажет строку с ошибкой.
Ответ отправил: sir henry (статус: Академик)
Отправлен: 24.11.2005, 19:18
Оценка за ответ: 4
Комментарий оценки:
Запускался исходник. Интересно что при установке флага Project/Option/Compiler/Debugging/UseDebugDCUs
ошибка переставала выскакивать (на моем компьютере). Хотя использовался объект без инициализации!! При установке любых других флагов (кроме этого) строка не определялась. Сообщалось, что где то в Application.Run;
Происходила ошибка.

Отвечает: REFERI
Здравствуйте, Березуев Роман Иванович!
Здесь идет обращение к памяти к которой это обращение запрещено!
Да можно найти эту строку и узнать что имеено приводит к ошибке.
Делфи богата возможностями отладки программ. Меню View Debug Window
СPU - там введете этот адрес и посмотрите что в нем находится.
Кроме того можно пошагово выполнять программу - клавиши F7 F8. Меню Run.
Так будет наглядней и проще - и вы увидете какая строчка вашего кода вызывает ошибку!

---------
Не судите, да не судимы будете...
Ответ отправил: REFERI (статус: 8-ой класс)
Отправлен: 24.11.2005, 20:58
Оценка за ответ: 5
Комментарий оценки:
Точно! Вводил, так куча ассемблера и ни одного знакомого идентификатора. Что дальше после окна CPU? Как определить строку кода по адрессу в памяти?
RUN, F7,F8 работают только до возникновения ошибки, после - уже нет. В программе более 6000 строк кода куда ставить breakpoint?

Отвечает: Master135
Здравствуйте, Березуев Роман Иванович!
Поймите, что при програмировании под каждую обьявленную вами переменную выделяется память. Таким образом программа занимает некоторую совокупность адрессов в памяти. Ошибка которую вы описали означает, что вы программно пытаетесь доступиться к области памяти, которая не имеет никакого отношения к переменным объявленным в вашей программе. Такая ситуация может возникнуть например при обращении к несуществующему элементу, скажем, динамического массива(см. приложение). А вообще я рекомендовал бы вам в приложении опубликовать исходник, чтобы эксперты могли хоть приблизительно понять в чем возникла ошибка конкретно, а не гадать.

Приложение:

---------
И пусть кто-то скажет что я не прав....

Ответ отправил: Master135 (статус: Студент)
Отправлен: 25.11.2005, 01:53
Оценка за ответ: 4
Комментарий оценки:
Угадали вы правильно, осуществлялось обращение по неинициализированной ссылке. Но вы поймите, только в главном модуле строк кода 6624. Мне пришлось по частям удалять участки программы чтобы локализовать ошибочный участок. Когда же я включал все галочки на опциях отладки ошибка уже не выскакивала. Так что задача состояло именно по информации об ошибке определить место в программе.

Отвечает: Lector
Здравствуйте, Березуев Роман Иванович!
:-)
Это означает, что объект, к которому происходит обращение не найдён. Скорее всего удалён. Узнать строчку можно в дебуггере.
---------
Хочешь помочь старику - сделай вместо него.
Хочешь помочь новичку - сделай вместе с ним.
Хочешь помочь мастеру - отойди и не мешай,
а хочешь помочь дураку - сам дурак.
Ответ отправил: Lector (статус: Студент)
Отправлен: 29.11.2005, 13:15
Оценка за ответ: 4
Комментарий оценки:
:(
Как узнать по address 00404ABA?


Вопрос № 30.158
Здравствуйте уважаемые эксперты.
Вот код процедуры, в указанном месте которой вылетает ошибка(Access violantion at adress 004036F4 in module 'primer.exe'. Read of adress FFFFFFFC). Не могу понять почему?!
P.S. Во время работы программы эта процедура прогоняется много раз + во время первого прогона i = 0

Приложение:

Отправлен: 24.11.2005, 19:33
Вопрос задал: Teapot (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Jadd
Здравствуйте, Teapot!
Хорошо бы весь код глянуть. Так сложно предположить.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 24.11.2005, 19:42

Отвечает: REFERI
Здравствуйте, Teapot!
Ошибка "Access Violation" возникает, когда идёт обращение к памяти к которой обращение запрещено.
Обращение к не созданному объекту.
var e:TEdit;
begin
e.text:='Hello world!';
end;

Обращение к уже разрушенному объекту:

var e:TEdit;
begin
...
e.free;
...
e.text:='Hello world';
end;
Тут есть хитрость, допустим вы хотите проверить есть ли объект и модернизируете код:
if e<>nil then e.text:='Hello world!';
или
if assigned(e) then e.text:='Hello world!';
Особенно часто приходится такое делать когда
надо уничтожить объект:
if e<>nil then e.free;
Так вот - такой код может быть источником ошибки, так как метод Free автоматически не устанавливает указатель в Nil. Обязательно после каждого Free используйте установление указателя в nil:
e.free;
e:=nil;

При выходе за границы динамического массива обычно генерится ошибка "Index out of bound", но возможно и возникновение Access Violation, особенно когда не стоят опции компилляции для проверки границ массивов. Эта ошибка может быть очень сложна в отлаживании - дело в том что допустим у вас есть массив а длиной в 10 элементов, в пишете:
a[20]:=something;
И эта строка может пройти как и надо, без всяких проблем, но её выполнение повредит какой-то другой код, причём каждый раз другой! Теперь самая безобидная операция типа i:=10 может вдруг внезапно дать Access Violation.
3) На форме на onCreate вызывается что-то с других форм - эти другие формы на этот момент еще не созданы
4) На форме на onDestroy вызывается что-то с других форм - эти другие формы на этот момент уже разрушены
Взято с Vingrad.ru
Надеюсь вы сами поймете именно свою ситуацию!
Удачи и по меньше access-ов!



---------
Не судите, да не судимы будете...
Ответ отправил: REFERI (статус: 8-ой класс)
Отправлен: 24.11.2005, 20:58
Оценка за ответ: 5
Комментарий оценки:
С первого захода ваш ответ для меня ничего не решил, но помозговав некоторое время, благодаря вашему ответу, я пришел к некоторым правильным мыслям! Моя проблема решена.

Отвечает: Vbhjndjhtw
Здравствуйте, Teapot!
Вот здесь "z := 1 to i do" попробуй сделать " z := 0 to i-1 do"
---------
Бороться и искать, найти и перепрятать!
Ответ отправил: Vbhjndjhtw (статус: 3-ий класс)
Отправлен: 25.11.2005, 07:01

Отвечает: sir henry
Здравствуйте, Teapot!
Значит Вы пытаетесь провести операцию над каким-то компонентом массива RadioButtons которого нет. Отсюда и ошибка - обращение к участку памяти в котором по Вашей программе должен быть объект RadioButtons[какой-то], а на самом деле там ничего нет.
Если Вы заранее не знаете сколько у Вас будет элементов, то объявите безразмерный массив:
var
RadioButtons : array of TRadioButton;
CountRb: word; {В этой переменной Вы будете определять кол-во элементов}
По ходу программы Вы определяете, сколько у Вас должно быть элементов и заносите это значение в CountRb. Дальше задаете размер массива элементов:
SetLength(RadioButtons, CountRb);
Теперь Вы используете эту переменную как максимальное количество в любом цикле и все будет нормально.
For i:=0 To CountRb-1 Do
RadioButtons[i] := TRadioButton.Create(Form1); {Создаете}
...
For i:=0 To CountRb-1 Do
RadioButtons[i].Free; {Удаляете}
Ответ отправил: sir henry (статус: Академик)
Отправлен: 25.11.2005, 08:18

Отвечает: Маренич Владимир
Здравствуйте, Teapot!
Скорее всего Вы пытаетесь освободить больше TRadioButton, чем создаете.
А если ошибка возникает при освобождении первого TRadioButton, то наверное Вы пытаетесь повторно уничтожить объекты, которые уничтожены компонентом-владельцем:
RadioButtons[i] := TRadioButton.Create(self);
//Вы указываете владельца self - некий компонент,
//в методе которого создаются TRadioButton
При уничтожении этого компонента созданные TRadioButton уничтожаются автоматически. Если Вы потом пытаетесь их уничтожить вручную, то и возникает такая ошибка, т.к. память, которая была выделена при создании TRadioButton, уже освобождена деструктором компонента-владельца.
Третий вариант - Вы пытаетесь уничтожить объекты, которые никогда не создавались. В данном случае нужно четко отслеживать этот момент.

Приложение:

Ответ отправил: Маренич Владимир (статус: 7-ой класс)
Отправлен: 25.11.2005, 10:42
Оценка за ответ: 5

Отвечает: Lector
Здравствуйте, Teapot!
Посмотрите, чему равен i при возникновении ошибки.
Посмотрите, чему равен елемент массива в этот момент и не освобождён ли он. Замените вызов функции free на вызов freeandnil(элемент). Это для начала :-).
---------
Хочешь помочь старику - сделай вместо него.
Хочешь помочь новичку - сделай вместе с ним.
Хочешь помочь мастеру - отойди и не мешай,
а хочешь помочь дураку - сам дурак.
Ответ отправил: Lector (статус: Студент)
Отправлен: 29.11.2005, 13:25


Вопрос № 30.198
Уважаемы эксперты. Хотелось бы задать вам очень хитрый вопрос:
У меня на компьютере стоит домашний сервер Apache (для PHP,MySQL)
в составе Denera (http://www.dklab.ru/). Ну так вот вопрос. Как с помощью Delphi 7 можно соединится с MySQl сервером и посылать ему запросы (а также получать результаты). MySql сервер по адресу "localhost", база "base", пользователь "root". И вобще реально ли это сделать не изучая какой либо литературы.
P.S. В Delphi есть закладкии Db express и др. Язык Sql знаю.
Заранее благодарен.
Отправлен: 25.11.2005, 10:48
Вопрос задал: Golden Spider (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Jadd
Здравствуйте, GoldenSpider!
Отчего ж "очень хитрый"? Я бы сказал, неполный. Посему отвечаю ровно так, как он задан. Можно. Можно и через DBExpress. Можно, через ADO. Можно через ODBC и БДЕ. Что ж тут хитрого? Можно не изучая литературу. Вообщем вопрос тривиальный. Если не найдешь примера или сам не знаешь как, пиши мне в мыл, пришлю пример.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Специалист)
Отправлен: 25.11.2005, 11:03

Отвечает: sir henry
Здравствуйте, GoldenSpider!
Не читая никакой литературы - нереально. Уж извините. :)
В общем случае, если речь не идет о высокоскоростной работе, то можно поставить драйвер ODBC для MySQL (http://dev.mysql.com/downloads/connector/odbc/3.51.html) и соеденятся через BDE. Однако BDE - это уже анахронизм, поэтому более продвинутый способ - через ADO. При этом можно так-же использовать ODBC драйвер, ADO этот способ предусматривает.
Если Вы работаете в Дельфи 2005, то лучше проставить провайдера ADO.NET для MySQL (http://dev.mysql.com/downloads/connector/net/1.0.html). Соединение опять же через ADO.
Можно поставить какой-либо компонент для прямого соединения с MYSQL, например ZEOS. Впрочем компонентов в инете куча, можете сами выбрать, какой Вам понравится.
Наиболее универсальный способ (и простой) ODBC.
Ответ отправил: sir henry (статус: Академик)
Отправлен: 25.11.2005, 11:15

Отвечает: Lector
Здравствуйте, GoldenSpider!
Я использую компоненты zeosdbo5. Соединяется без проблем и вообще, в переделанном виде, жалоб не вызывают. :-)
---------
Хочешь помочь старику - сделай вместо него.
Хочешь помочь новичку - сделай вместе с ним.
Хочешь помочь мастеру - отойди и не мешай,
а хочешь помочь дураку - сам дурак.
Ответ отправил: Lector (статус: Студент)
Отправлен: 29.11.2005, 13:30
Оценка за ответ: 5
Комментарий оценки:
Хроший совет.


Вопрос № 30.199
Пытался написать программу которая, если запоминает шрифт объкта Tmemo в файл,а при следующем запуске использует его.
Но почему-то она не работает. В приложении сокращенный листинг программы. Помогите я уже измучался!

Приложение:

Отправлен: 25.11.2005, 11:17
Вопрос задал: Golden Spider (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: sir henry
Здравствуйте, GoldenSpider!
А какие свойства шрифта Вы меняете у Мемо? Уверен почти на 100%, что только название шрифта и его размер. Верно? Тогда зачем сохранять в файле весь объект целиком, когда можно сохранить только два этих параметра?
var
f: TextFile; {Текстовый, потому что Вы всегда можете глазами проконтролировать то, что сохранили}
Begin
AssignFile(f, 'font.dat');
{Сохранение}
Rewrite(f);
Write(f, Memo1.Font.Name, Memo1.Font.Size);
CloseFile(f);
...
{Загрузка}
Reset(f);
Read(f, Memo1.Font.Name, Memo1.Font.Size);
CloseFile(f);
...
End;
Ответ отправил: sir henry (статус: Академик)
Отправлен: 25.11.2005, 11:40
Оценка за ответ: 4
Комментарий оценки:
Вы предложили альтернативный вариант.
А я просил разобраться с основным.

Отвечает: Архангельский Андрей Германович
Здравствуйте, Golden Spider!

по моему ошибка с ледующем - ты создаешь файл шрифта, но записываешь туда описание шрифта, но не сам шрифт.

В твоем случае лучше использовать компонент TDataFile, который запоминает описание шрифта в файле, который подобен ini-файлу, но с раширенными возможностями, например, с шифрованием файла.
Описание смотри в приложении:

Приложение:

Ответ отправил: Архангельский Андрей Германович (статус: Студент)
Отправлен: 25.11.2005, 16:15
Оценка за ответ: 5
Комментарий оценки:
Хорошее решение!
Только, я записываю не описание а адрес как мне объяснили.

Отвечает: Маренич Владимир
Здравствуйте, GoldenSpider!
Ошибка в том, что Вы в файл пишите значение указателя на объект шрифта, а не сам TFont.
Для записи и чтения можете использовать процедуры из приложения.
Можете поменять параметр F: TFont на M: TMemo и соответсвенно в коде F. на M.Font.

Приложение:

Ответ отправил: Маренич Владимир (статус: 7-ой класс)
Отправлен: 25.11.2005, 17:48

Отвечает: REFERI
Здравствуйте, GoldenSpider!
Измучались? Ну чтож тогда пришло время узнать как все-таки это делается!
Я исправил вам 2 процедуры - FormClose и FormActivate и привел их в приложении.
Что изменилось? Вы пытались сделать свою задумку, работая с Font, а надо работать с Font.name. Шрифт это общее понятие, к которому мы с вами привыкли.
Не станем же мы говорить "закачай мне новых имен шрифтов" :) (м-да... бред)
И еще изменился тип файла. Мы больше не работаем с "фонт" Просто textfile.
Удачи в кодинге!

Приложение:

---------
Не судите, да не судимы будете...

Ответ отправил: REFERI (статус: 8-ой класс)
Отправлен: 25.11.2005, 20:12


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

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

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

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

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


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


© 2001-2005, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Яндекс Rambler's Top100 hotlog_js="1.0"; hotlog_r=""+Math.random()+"&s=314124&im=101&r="+escape(document.referrer)+"&pg="+ escape(window.location.href); document.cookie="hotlog=1; path=/"; hotlog_r+="&c="+(document.cookie?"Y":"N"); hotlog_js="1.1";hotlog_r+="&j="+(navigator.javaEnabled()?"Y":"N") hotlog_js="1.2"; hotlog_r+="&wh="+screen.width+'x'+screen.height+"&px="+ (((navigator.appName.substring(0,3)=="Mic"))? screen.colorDepth:screen.pixelDepth) hotlog_js="1.3" hotlog_r+="&js="+hotlog_js; document.write("HotLog")

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Архив рассылки
Отписаться
Вспомнить пароль

В избранное