Форум: "Основная";
Текущий архив: 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.006 c