Chief-NET

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Chief-NET » Паскаль в среде Borland Delphi » StringGrid


StringGrid

Сообщений 1 страница 8 из 8

1

У меня в StringGrid есть в каждой ячейке как в хекс эдиторе 16-ные цифры - в первой 00, во-второй 1А, в третьей 4В и т.д. Как в ром записать данные из StringGrid'а, допустим я с помощью  Seek(F, $87); выбрал место и мне теперь в него нужно записать все символы по-порядку из StringGrid'а, т.е. от StringGrid1.Cells[0,0] до StringGrid1.Cells[11,7] (у меня 8 строк и 12 столбцов)???

Как запись производить - побайтно или ещё как? Хелп!!!

2

Значит так: у меня стринггрид и в каждой его ячейке по одному знаку (0..9,А,В,С,D,E,F) И информацию из него нужно в ром обратно записать, т.е. нужно создать массив в котором каждое его число будет состоять из двух чисел из соседних ячеек?

допустим у меня в стринггриде инфа такая:

0 0 1 3 4 А 3 В
4 5 2 С 4 5 2 6
3 6 7 3 С А В А

При сохранении в ром нужно создать массив saveArray : array[1..12] of byte, в котором все числа будут такие: 00 13 4А 3В 45 2С 45 26 36 73 СА ВА

И потом записать это в ром:

...
AssignFile(F, SaveDialog1.FileName);

Reset(F,1);
Seek(F, $87); //нужное место в роме
BlockWrite(F, saveArray, 1);
CloseFile(F);
end;
end;

Так вот - вся беда в том, что я не могу получить этот массив из стринггрида (не согласуются у меня byte и string) - помогите с этим для меня непростым делом, умоляю!!! Я вообще слабо представляю - если тип byte то вообще в каком виде информация пишется в ром? Совсем я запутался с переводом чисел из одной системы счисления в другую... К какому виду приводить числа перед их записью в ром???

3

Тип byte - это тот же integer, только ограниченный 255 сверху и 0 снизу, вот и всё, работать с ним нужно так же как и с обычным integer.

Для того, чтобы согласовать string и byte нужно перевести string в byte командой strtoint(string), но в твоём случае в ячейках хранятся шестнадцатиричные коды, а не десятичные, поэтому их нужно предварительно перевести из hex в dec, что по сути будет равносильно команде strtoint(string), когда в string записано десятичное значение.
Вот функция перевода hex->dec:

function hextoint(s:string):longint;
var
z,i:integer;
begin
z:=0;
for i:=1 to length(s) do begin
case s[i] of
'1'..'9':z:=z+strtoint(s[i])*trunc(power(16,length(s)-i));
'A':z:=z+10*trunc(power(16,length(s)-i));
'B':z:=z+11*trunc(power(16,length(s)-i));
'C':z:=z+12*trunc(power(16,length(s)-i));
'D':z:=z+13*trunc(power(16,length(s)-i));
'E':z:=z+14*trunc(power(16,length(s)-i));
'F':z:=z+15*trunc(power(16,length(s)-i));
end;
end;
hextoint:=z;
end;

Думаю, как ей воспользоваться ты догадываешься ;)

4

Спасибо Алекс! Хоть я сделал не так всё, а более "тупо" - ты мне очень помог...

Я функцию перевода хекс числа не писал, а написал так:

procedure TForm1.BitBtn4Click(Sender: TObject);
var
  Buf,Buf1: Byte;
  H: file of Byte;
begin
if SaveDialog1.Execute then
   begin
AssignFile(H, SaveDialog1.FileName);
Reset(H);
  Seek(H, k); //нужное место в роме

for j := 0 to StringGrid1.RowCount - 1 do
  for i := 0 to StringGrid1.ColCount - 1 do
  begin
  stop:=stop+1;//счётчик

  if StringGrid1.Cells[i, j]='A' then save1:='10';
  if StringGrid1.Cells[i, j]='B' then save1:='11';
  if StringGrid1.Cells[i, j]='C' then save1:='12';
  if StringGrid1.Cells[i, j]='D' then save1:='13';
  if StringGrid1.Cells[i, j]='E' then save1:='14';
  if StringGrid1.Cells[i, j]='F' then save1:='15';

  if StringGrid1.Cells[i, j]='A' then save2:='10';
  if StringGrid1.Cells[i, j]='B' then save2:='11';
  if StringGrid1.Cells[i, j]='C' then save2:='12';
  if StringGrid1.Cells[i, j]='D' then save2:='13';
  if StringGrid1.Cells[i, j]='E' then save2:='14';
  if StringGrid1.Cells[i, j]='F' then save2:='15';

    if stop=1 then Buf1 := (StrToInt(save1));
    if stop=2 then Buf := (Buf1*16+StrToInt(save2));//так как у меня первая часть числа в одной ячейке, а вторая - в следующей

    if stop=2 then
    BlockWrite(H, Buf, 1);
    if stop=2 then save3:=0;//обнуление счётчика
  end;
CloseFile(H);
end;

Отредактировано Guyver (2007-03-19 13:25:45)

5

...if stop=2 then stop:=0;//обнуление счётчика

6

Да, точно - это просто я старый вариант выложил...

7

Если честно, то код этот слишком уж громосткий, я бы сначала просто сложил две ячейки вместе (получил хекс-код байта) и после перевода в integer записывал результат в ром, и благодаря этому избавился бы от счетчика, внутреннего цикла и переменной save2, что привело бы к ускорению работы программы.

8

Это ещё что - видел бы ты процесс загрузки уровня - это ещё то тормозилово (если интересно - скачай прогу на моём сайте (Wrecking Crew Editor) - сам увидишь) А код у меня - просто АТАС - его оптимизировать и оптимизировать надо!!! А я не могу - плохо с математикой/программированием/мышлением и т.п.


Вы здесь » Chief-NET » Паскаль в среде Borland Delphi » StringGrid