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

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


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

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

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

Выпуск № 255
от 04.10.2005, 17:21

Администратор:Калашников О.А.
В рассылке:Подписчиков: 245, Экспертов: 49
В номере:Вопросов: 3, Ответов: 8


Вопрос № 26992: Здравствуйте уважаемые эксперты. Сейчас учу типы данных. В мануале написано, что так можно делать: var s : PChar; begin s := 'Это строка типа PChar'; s[21] := '!'; Edit1.Text := s; , но на деле, при работе программ...
Вопрос № 27016: Всем СалюТ! Вопсчем в TMonthCalendar я делал: см.прил. -выделение жирным соответствующих дат. теперь все тоже надо сделать в TDateTimePicker. Процедурка BoldDays есть, но нету события СalendarGetMonthInfo, то есть я не могу получить з...
Вопрос № 27025: Таблица Paradox, компоненты TTable, DBGridEh (компонент из коллекции EhLib). В базе одно поле типа Logical (True или False). Как сделать сортировку по этому полю в DBGridEh?...

Вопрос № 26.992
Здравствуйте уважаемые эксперты.
Сейчас учу типы данных. В мануале написано, что так можно делать:
var
s : PChar;
begin
s := 'Это строка типа PChar';
s[21] := '!';
Edit1.Text := s;
, но на деле, при работе программы, выходит ошибка (Access violantion at adress 004524AC in module 'Project1.exe'. Write of address 00452501.) Пожалуйста поясните.
Отправлен: 28.09.2005, 20:05
Вопрос задал: Teapot (статус: Посетитель)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Jadd
Здравствуйте, Teapot!
Ответ кроется в смысле типа PChar. Этот тип - указатель на тип char. Иными словами, за конструкцией s := 'Это строка типа PChar'; стоит несколько действий:
1)выделить память под строку размером 21 байт.
2)поместить туда значения строки и вернуть указатель на первый ее байт.

Т.е. в строке s[21] := '!'; идет обращение к области памяти, которой не существует, т.е. выход за границы области памяти, обтведенной под эту строку. Так делать, естессно, нельзя. Ваш код должен быть таким:
s := 'Это строка типа PChar';
Edit1.Text := s + '!';

Удачи.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Практикант)
Отправлен: 28.09.2005, 20:49

Отвечает: Denis Hakimov
Здравствуйте, Teapot!
Дело в том, что вы пытаетесь присвоить значение не существующей области памяти. Тип PChar - это Pointer to Char ,другими словами указатель на строку (реально на первый символ в памяти) а последний символ в строках для Windows всегда символ #0. Для присвоения Edit'у нужного вам значения лучше использовать операцию сложения:

S:='Bla Bla Bla';
Edit1.Text:=S+'!';

Если же хотите пользоваться вашим методом, то преобразуйте указатель S в строку используя такой вариант:

var s : PChar;
str: String;
begin
s := 'Это строка типа PChar';
str:=String(s);
str[22]:='!';
Edit1.Text := str;

Ответ отправил: Denis Hakimov (статус: 3-ий класс)
Отправлен: 28.09.2005, 21:04

Отвечает: sir henry
Здравствуйте, Teapot!
У Вас 21 знак в строке s - завершающий ноль (он есть в любом типе PChar, читайте внимательно описание типов). Заменять его чем-либо другим нельзя - Вы разрушите тип.
Убедитесь в этом с помощью такой строки:
Edit1.Text:=s[21]; {У Вас в эдите ничего не будет}
Edit1.Text:=s[20]; {У Вас в эдите будет буква r - вот ее можете спокойно заменять}
Другой косяк - не забывайте, что PChar - это не строка, а указатель на массив символов, поэтому просто так, как в обычной строке, символ там заменить нельзя.
Т.к. во многих случаях Дельфи внутри себя конвертирует PChar в String и наоборот, может создаваться некоторая путаница в использовании этих типов.
Если нужно добавить в конец строки символы, то необходимо выделить дополнительную память под эти символы.
В подавляющем большинстве случаев лучше пользоваться типом string. На самом деле это аналог PChar, т.е. динамическая строка, память под которую выделяется автоматически при добавлении в нее символов. PChar нужен только если Вы обращаететсь к функциям WinAPI. При этом обычная строка конвертируется в PChar так:
PChar(String);
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 29.09.2005, 06:16
Оценка за ответ: 5

Отвечает: Lector
Здравствуйте, Teapot!
Всё дело в том, что тип pchar - это ссылочный тип.
в строке s := 'wqeqweqwe' вы создаёте ссылку на константу и естественно, когда собираетесь её менять выводится exception.
Смотри приложение

Приложение:

---------
Хочешь помочь дураку - сам дурак

Ответ отправил: Lector (статус: 4-ый класс)
Отправлен: 29.09.2005, 11:43

Отвечает: Romodos
Здравствуйте, Teapot!
Так делать можно только с типом string
a s[i] доступно только readonly, т.е. его можно читать, но в него нельзя писать.
---------
FAQ me off!
Ответ отправил: Romodos (статус: 8-ой класс)
Отправлен: 29.09.2005, 18:37


Вопрос № 27.016
Всем СалюТ!
Вопсчем в TMonthCalendar я делал: см.прил.
-выделение жирным соответствующих дат.
теперь все тоже надо сделать в TDateTimePicker.
Процедурка BoldDays есть, но нету события СalendarGetMonthInfo, то есть я не могу получить занчения переменной MonthBoldInfo. ечсли логически посудить,этот параметр служит для определения месяца.
но каким образом,непонятно. тип variant
пробовал подставлять разные значения.. даты не выделяются.
помогите..

-------
или предложите другой способ выделения дат.может цветом(что даже лучше).
пасиба

Приложение:

Отправлен: 29.09.2005, 12:17
Вопрос задал: Hooligan_saransk (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: sir henry
Здравствуйте, Hooligan_saransk!
Там не тип Variant, а LongWord.
Переменная эта получается точно так-же - в событии OnGetMonthInfo.
Единственная неувязочка - у него, как у наследника TCommonCalendar, событие это спрятано (в отличие от TMonthCalendar). Можно создать наследника от TDateTimePicker и объявить у него это свойство так-же, как это сделано у TMonthCalendar.
Если честно, я не знаю, что еще придумать. :)
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 29.09.2005, 13:43


Вопрос № 27.025
Таблица Paradox, компоненты TTable, DBGridEh (компонент из коллекции EhLib). В базе одно поле типа Logical (True или False). Как сделать сортировку по этому полю в DBGridEh?
Отправлен: 29.09.2005, 16:31
Вопрос задал: Rusland (статус: Студент)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 6)

Отвечает: sir henry
Здравствуйте, Rusland!
Странный вопрос. :)
А почему Вы не сделали индекс по этому полю в таблице? Вот Вам и сортировка будет.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 29.09.2005, 18:16
Оценка за ответ: 3
Комментарий оценки:
В том то и дело что невозможно создать индекс по логическому полю :(

Отвечает: Denis Hakimov
Здравствуйте, Rusland!
Попробуйте использовать вместо TTable компонент TQuery и добавте к запросу (свойство SQL) сортировку т.е. Query1.SQL.Add('||Тут Ваш Запрос || ORDER BY ||поле по которому собираетесь сортировать ||');
Загляните также на сайт
http://dev.mysql.com/doc/mysql/ru/index.html
там лежит справичник по SQL.
Ответ отправил: Denis Hakimov (статус: 3-ий класс)
Отправлен: 29.09.2005, 19:23
Оценка за ответ: 3
Комментарий оценки:
Спасибо, но нужен именно Table.


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

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

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

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

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


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


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Rambler's Top100 Яндекс


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

В избранное