Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.05.16;
Скачать: [xml.tar.bz2];

Вниз

StringGrid. Очень интересно как...Спасибо.   Найти похожие ветки 

 
Novak   (2002-04-30 12:03) [0]

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


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

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

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


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


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

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


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

>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 13:03) [4]

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


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

>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.


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

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


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

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


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

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


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

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


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

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


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


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

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


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

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

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.05.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.01 c
3-49879
Tolick
2002-04-19 13:41
2002.05.16
Конвертировать словарь DCT в DDF


1-50021
Dinara
2002-05-01 13:21
2002.05.16
Как освободить переменную?


6-50072
MK
2002-03-05 01:52
2002.05.16
Как прикрепить файл к письму?


3-49858
Chuvi
2002-04-19 11:53
2002.05.16
Как использовать LIKE , в запросе для SQL- сервера ?


4-50163
Королев
2002-03-15 10:02
2002.05.16
Как из своей проги нажать в чужом окне RadioButton?какая wm_message?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский