Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2012, 20:29   #1
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию Ошибка с переменной или с преобразованием? Внутри.

Написал эту программу чтобы кое-что для себя протестировать. Поэтому и есть инструкции, типа: "Label10.Caption:= 'X:' + IntToStr(g + 1) + ' Y:' + IntToStr(r + 1);"

Но программа останавливается ошибкой: "Недостаточно памяти для обработки команды" .
Код:
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  dcol: longint;
begin
  begin
    dcol:= ColorToRGB(Image3.Canvas.Pixels[x,y]);  ///////вот здесь ошибка
    r:= dcol;
    g:= dcol shr 8;
    b:= dcol shr 16;
    Label10.Caption:= 'X:' + IntToStr(g + 1) + '   Y:' + IntToStr(r + 1);

    if not odd(r) then
      begin
        ig:= g * 120;
        ig:= ig - 60;

        if r = 0 then
          ir:= r * 60
        else
          begin
            ir:= r div 2;
            ir:= ir * 60;
          end;
        ir:= ir - 30;
        Label13.Caption:= 'X:' + IntToStr(ig) + '   Y:' + IntToStr(ir);
      end;
    if odd(r) then
      begin
        ig:= g * 120;
        ir:= r * 30;
        ir:= ir - 30;
        Label13.Caption:= 'X:' + IntToStr(ig) + '   Y:' + IntToStr(ir);
      end;
  end;
  
  if Image2.Canvas.Pixels[x,y] = $000000 then Label9.Caption:= 'S 0';
  if Image2.Canvas.Pixels[x,y] = $000001 then Label9.Caption:= 'S 1';
  if Image2.Canvas.Pixels[x,y] = $000002 then Label9.Caption:= 'S 2';
  if Image2.Canvas.Pixels[x,y] = $000003 then Label9.Caption:= 'S 3';
  if Image2.Canvas.Pixels[x,y] = $000004 then Label9.Caption:= 'S 4';
  if Image2.Canvas.Pixels[x,y] = $000005 then Label9.Caption:= 'S 5';
  if Image2.Canvas.Pixels[x,y] = $000006 then Label9.Caption:= 'S 6';
  if Image2.Canvas.Pixels[x,y] = $000007 then Label9.Caption:= 'S 7';
  if Image2.Canvas.Pixels[x,y] = $000008 then Label9.Caption:= 'S 8';
  if Image2.Canvas.Pixels[x,y] = $000009 then Label9.Caption:= 'S 9';
end;
Нужно это оптимизировать? В том и дело, что все эти инструкции желательно выполнять в этой процедуре.
Или нужно освобождать память?
В чем причина?
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 17.02.2012, 21:06   #2
VyachNik
Пользователь
 
Аватар для VyachNik
 
Регистрация: 09.02.2012
Сообщений: 12
По умолчанию

может так?:
var dcol: cardinal;
r,g,b: byte;
x,y: integer;
begin
dcol:= Image3.Canvas.Pixels[x,y];
r:=GetRValue(dcol);
g:=GetGValue(dcol);
b:=GetBValue(dcol);
........

Последний раз редактировалось VyachNik; 17.02.2012 в 21:11.
VyachNik вне форума Ответить с цитированием
Старый 17.02.2012, 21:15   #3
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Еще вопрос, могут ли на это повлиять размеры Image ? Например 5000х5000
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 17.02.2012, 21:15   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Image3.Canvas
Как ты туда рисунок загрузил?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.02.2012, 21:17   #5
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Как ты туда рисунок загрузил?
Нарисовал канвой, методом Polygon
Код:
...
begin
  Image1.Canvas.Pen.Color:= $000009;  //граница маски
  Image1.Canvas.Brush.Color:= $000009;  //заливка маски
  Image1.Canvas.Polygon([Point(ig, ir + 30), Point(ig + 60, ir + 60), Point(ig + 120, ir + 30), Point(ig + 60, ir)]);  //рисуем маску (это просто ромб)
end;
...
И это исполнялось в цикле
даешь высокое напряжение

Последний раз редактировалось Vova777; 17.02.2012 в 21:20.
Vova777 вне форума Ответить с цитированием
Старый 17.02.2012, 21:35   #6
VyachNik
Пользователь
 
Аватар для VyachNik
 
Регистрация: 09.02.2012
Сообщений: 12
По умолчанию

у меня получалось с такими размерами:
10х32748 и 32767х10 пикселей;
если меньший размер увеличить до какого-то определенного значения, то выскакивало окошко с ошибкой:
System of out (просто ресурсов компа не хватало )
VyachNik вне форума Ответить с цитированием
Старый 17.02.2012, 21:38   #7
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Значит размер 5000х5000 не может повлиять на это?
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 17.02.2012, 22:53   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Нарисовал канвой, методом Polygon
Где????
Цитата:
dcol:= ColorToRGB(Image3.Canvas.Pixels[x,y]); ///////вот здесь ошибка
Обрати внимание на имя компонента, и посмотри что ты мне ответил.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.02.2012, 10:05   #9
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Обрати внимание на имя компонента, и посмотри что ты мне ответил.
Все верно. Основной рисунок, который видит пользователь, лежит в ScrollBox1.Image 1. В ScrollBox2.Image 2 и ScrollBox3.Image 3 созданы маски основного рисунка. Маски создаются также методом Polygon.

Когда водят мышью по Image 1, то по координатам курсора информация читается также и из масок.
Код:
...
  Image1.Canvas.Polygon([Point(ig, ir + 30), 
    Point(ig + 60, ir + 60), Point(ig + 120, ir + 30), 
      Point(ig + 60, ir)]);  //рисунок, созданный в основном Image, с помощью Polygon, исполняемого в цикле, с изменением переменных ig и ir
...
  dcol:= ColorToRGB(Image3.Canvas.Pixels[x,y]);  //здесь читается RGB-код цвета пикселя на маске 1
...
  if Image2.Canvas.Pixels[x,y] = $000000 then Label9.Caption:= 'S 0'; //здесь читается RGB-код цвета пикселя на маске 2
...
даешь высокое напряжение

Последний раз редактировалось Vova777; 18.02.2012 в 10:09.
Vova777 вне форума Ответить с цитированием
Старый 18.02.2012, 11:24   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Маски создаются также методом Polygon.
Вот теперь понятно. Я думал что ты загружаешь изображение из файла, в этом случае Image любит выкобениваться...
Кстати, а не попробовать ли тебе заменить Image на PaintBox раз ты все равно рисуешь программно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нахождение слов-анаграмм, Ошибка выдается. Задание внутри. Код внутри. TYMON Общие вопросы .NET 2 22.11.2010 21:07
Как изменить значения переменной внутри процедуры kartalex Помощь студентам 5 20.11.2010 18:44
использование 2х мерных массивов внутри функции или процедуры kartalex Общие вопросы Delphi 17 22.09.2010 16:30
Форматирование текста внутри поля. как? или другие варианты... smoky Microsoft Office Access 2 26.12.2008 19:09
лежит ли заданная точка А внутри или вне много-угольника. Anton1997 Общие вопросы Delphi 4 30.11.2008 16:07