Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

StringGrid. Очень интересно как...Спасибо.


Novak ©   (2002-04-30 12:03:00) 

...как превратить StringGrid в что-то типа IntegerGrid (ну воопщем содержимое ячеек должно быть числовым)?


Vovchik   (2002-04-30 22:07:00) [1]

>Вполне возможно, я пробовал... конечно если гриды не по 1000 >строчек... Да и вообще что он подразумевает под IntegerGrid? >Чтобы были числа? Так их и так можно ввести через любой Edit... ^(

Можно, конечно. Но заведомо глючить будет, если сделать "примитивный" отлов клавиш.


PaRL   (2002-04-30 21:45:00) [2]


> Не, народ. вы все неправы.

Почему?
Вполне возможно, я пробовал... конечно если гриды не по 1000 строчек... Да и вообще что он подразумевает под IntegerGrid? Чтобы были числа? Так их и так можно ввести через любой Edit... ^(


Vovchik   (2002-04-30 14:19:00) [3]

Вот, можешь посмотреть. Не уверен, что тебе именно это нужно.
http://delphi.mastak.ru/cgi-bin/download.pl?get=1020161925&n=0.


Novak   (2002-04-30 14:08:00) [4]

re Vovchik: Всё понял положи в кладовку. Спасибо, я думаю пригодится.


Vovchik   (2002-04-30 13:49:00) [5]

> Novak (30.04.02 13:32)
Не понял вопроса. В моём самодельном TFloatEdit"е можно вбить только число, считать можно в виде числа и в виде строки. НО ТОЛЬКО ЧИСЛА. Для нечисел есть обычный едит...


Novak   (2002-04-30 13:32:00) [6]

Re//Vovchik : прямо в яблочко. То что нужно. Я только не понял в TFloatEdit можно использовать значения ячеек без преобразования в Integer (что-то типа електронной таблицы)?
Если можеш кинь в кладовку.


Song   (2002-04-30 13:28:00) [7]

У TStringGrid есть свойство Object. Если использовать его, расход памяти будет минимальным.


Vovchik   (2002-04-30 13:18:00) [8]

>gek © (30.04.02 13:03)

То что оно будет работать - это беспорно. Вопрос - насколько хорошо.

А касаемо памяти - это я специально проверял и могу утверждать. Это делается так создаём стринг грид и заполняем его большим количеством коротких строк - в моём случае это были числа, считанные из файла. Их было около 700 тысяч штук, каждое реально занимало 5 - 16 байт. А программа после этого занимала памяти (посмотрел в таскменеджере) столько памяти, как будто под каждое число выделено 1 (4 ?) Кб.

Потом я специально проверил как выделяет память дельфийный менеджер. У меня был файл, содержащий записи типа:

TMyRec=record
p:pchar;
n:byte;
end;

Файл был нетипизированный, фактически хранил в себе образ памяти. Записей было около 1000. Я считывал его в массив типа TMyRec. И что же? Файл на диске занимал 25 Кб. Это реальное количество памяти, необходимое под данные, которые в нём были. А после загрузки этого файла в память программа распухала примерно на 4 Мб. Оказалось, что при выделении памяти GetMem под PChar, реально выделяется 4 Кб, необходимый кусок из которого помечается как доступный на чтение и запись, а всё остальное помечается как недоступная ни для чтения, ни для записи память. И она фактически не используется, но выделена. Если сделать ещё раз GetMem, то будет выделен ещё раз кусок 4Кб. Поэтому в моём случае около 1000 записей, вот и получилось 1000*4 Кб = 4Мб.

Если не верите, можете отрассировать программу начиная со строки GetMem (или SetLength - это всё равно).

Так что сами решайте, стоит ли использовать дельфийные GetMem для выделения большого числа маленьних кусочков памяти. Я в результате использовал GlobalAlloc, GlobalLock и GlobalRealloc.


gek   (2002-04-30 13:03:00) [9]

> Vovchik © (30.04.02 12:38)
Я специально попробовал то, что я написал. Вполне работает нормально. Ну а Stringgrid содержит строки, просто в данном случае сосоящими их цифр. Насчет выделения памяти под ячейку не знаю честно говоря.
Насчет проблемы двух точек совершенно согласен, отслеживать крайне проблематично.
Вопрос был то именно про Stringgrid, я написал примерно как я думаю.
Мнения могут быть различны.


Vovchik   (2002-04-30 12:38:00) [10]

>PaRL © (30.04.02 12:24)
>gek © (30.04.02 12:27)

Не, народ. вы все неправы. Так как вы говорите, конечно, можно. То только теоретически. Если вы попробуете реализовать это на практике, то вам потребуется много времени и гемора.

Дело всё в отстое самого StringGrid. Хотите объясню? А именно, под каждую ячейку в стринг гриде выделяется то ли 1 Кб, то ли 4 Кб памяти, точно не помню. Но представьте, даже если 1 Кб. Число в строковом исполнении может занимать максимум 12 байт. Посчитайте, сколько вы потерятете памяти зря. Я с этим бился 2.5 года назад и пришёл к выводу, что проще и лучше написать свой компонент с нуля. Так я и сделал. Сначала я написал TFloatEdit, в который можно записать только число. Там это сделано гораздо грамотнее, чем если просто отслеживать нажимаемые клавиши в событии OnKeyDown у обычного едита. Этот компонент дописан полностью, если интересует могу положить в кладовку.
А потом я уже сделал TFloatDataGrid и TFloatDataSheet. Но они не совсем доведены до ума, но текста в них уже около 130 Кб.

Особенно проблемно редактировать содержимое TStringGrid, отслеживая введение неверных символов. Например, "точка" - допустисый символ. А если человек введёт две точки - это уже нельзя. Поэтому надо делать преобразование имеющейся строки на лету и проверять, может ли она быт преобразована в число.

ЗЫ: ессно, у меня есть возможность вводить только целые числа в TFloatEdit.


gek   (2002-04-30 12:27:00) [11]

Достаточно тривиально
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if not(key in["0".."9",#8]) then
key:=#0
end;


PaRL   (2002-04-30 12:24:00) [12]

Что то я не совсем тебя понимаю...
Надо просто каждую ячейку переводить в Integer, естесственно проверив, число ли в ней записано.

var i : integer;
begin
try
i := StrToInt(StringGrid.Cells[1,1]);
except
ShowMessage("Ошибка записи числа : " + StringGrid.Cells[1,1]);
end;


PS Вопрос неточный :(


Наверх

Титульная страница Поиск, карта сайта Написать письмо