Current time: 21.07.2017, 23:41 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
С++, общая тема
Author Message
packa Offline

Posts: 1218
Post: #31

Ну а как поступать то если на рисунке присутствуют элементы с цветом фона?


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
27.11.2011 18:19
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6138
Post: #32

packa, покажи уж рисунок, что ли. А то ничего непонятно...


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
27.11.2011 19:24
Find all posts by this user Quote this message in a reply
GrayFace Offline
Forum Moderators

Posts: 1238
Post: #33

(27.11.2011 13:21)Efrit Wrote:  
Quote:В левом-нижнем. Проверил в Delphi 2006.

А причём тут Делфи? Проверь в С++ - убедишься, что в левом верхнем...
Так классы единые.

(27.11.2011 18:19)packa Wrote:  Ну а как поступать то если на рисунке присутствуют элементы с цветом фона?
Сменить цвет фона.


Вся правда обо мне
27.11.2011 23:12
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6138
Post: #34

Quote:Так классы единые.

Значит, не совсем единые. Проще уж проверить и убедиться, что в TImage пиксель (0; 0) - именно левый верхний...


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
28.11.2011 17:19
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 10163
Post: #35

0; 0 = левый верхний везде.
28.11.2011 18:07
Find all posts by this user Quote this message in a reply
GrayFace Offline
Forum Moderators

Posts: 1238
Post: #36

Проверил и в С++ Builder'е на TImage - нижний левый используется.


Вся правда обо мне
23.12.2011 12:03
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1218
Post: #37

В с++ builder аналог Scale из visual Basic?

Он задает свою координатную систему - например scale(-10,10)-(10,-10) (точно не помню) создаст сетку от х -10 до 10 и тажке с у.

хочу сделать вот это: Image: 3427fff4105at.jpg
8х8

Спрашиваю здесь, потому что не в состоянии сформулировать адекватный запрос в поисковик


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
13.01.2012 22:30
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6138
Post: #38

Не, такого нету. Вроде бы, у всех стандартных VCL-ных элементов нумерация идёт с нуля (отрицательных чисел в координатах быть не может), и никакой сетки они не рисуют. Но ты можешь создать свой, наследовав его, например, от TPaintBox: в конструктор прописать генерацию сетки, ну и прописать собственные функции для рисования функций...

P.S. Хотя нет, среди компонентов Samples есть некий TPerfomanceGraph - это то, что тебе нужно?


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
14.01.2012 11:40
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1218
Post: #39

Пока совсем не разобрался - везде на формах задают вопросы об этом компоненте, но нигде еще не встречал ни одного ответа))) Странно.

Но где то в сорсах откопал

Code:
bcppb
PerformanceGraph1->StepSize=3
PerformanceGraph1->Scale=100
думаю как раз то!

Спасибо!


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
14.01.2012 17:33
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1218
Post: #40

Quote:Image: b875b9a1d96bt.jpg

Имеется поле 8х8 нарисованное по массиву слева, через Канву.
Канвой же заливается тот цвет, который означает каждая цифра.

В последствии вместо цвета планирую добавить картинки. Внимание вопрос:
Как можно реализовать "перетаскивание" этих блоков, чтобы собирать 3 в ряд?
Сейчас это через 4 Edit'а, что достаточно уныло)

Я вижу только 1 способ - отлов координат мыши щелчка, и в соответствии с координатами (если х>100 && x<120, y>30, y<50 то блок 1)
Но это достаточно кривое решение, у вас есть идеи?


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
18.01.2012 20:38
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6138
Post: #41

какой ужас на заднем фоне ))

Как именно реализовано это поле? Через канву главной формы? Если да, то решать приведённую тобой задачу не имеет смысла - ведь коли ты планируешь "вместо цвета добавить картинки", то код в любом случае придётся переписывать...

Могу уж тогда написать решение для перетаскивания картинок, что ли.

P.S. Почему это "квадратистое" поле имеет размеры 8*7, тогда как "числовое поле" - 8*8? Rolleyes


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
18.01.2012 21:21
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1218
Post: #42

Quote:P.S. Почему это "квадратистое" поле имеет размеры 8*7, тогда как "числовое поле" - 8*8?
Блин.
Это пакка-квадрат. Если говорится о фигуре 8х8, то будет 8х7, аналогично 6х6 - 6х5 Rolleyes
Кстати, нужно будет поменять, на пакка квадрат 8х9

Quote:Могу уж тогда написать решение для перетаскивания картинок, что ли.
Был бы рад получить небольшой кусок кода, отрисовки картинки.
Просто ранее часто сталкивался с проблемой всяких очисток переменных и т.д. Тем более в цикле вообще сплошные баги из за этого.

Вот с цветными квадратами
Code:
for(i = 1 ;i < 9; i++)
        {
        for(j = 1 ;j < 9; j++)
                {
                a=bh[i][j];
switch (a)
{
  //case 1   : Form1->Canvas->Brush->Color = RGB(0, 0, 0);
  case 0   : Form1->Canvas->Brush->Color = (TColor)RGB(33,22,145);  break;
  case 1   : Form1->Canvas->Brush->Color = clGray;        break;
  case 2   : Form1->Canvas->Brush->Color = clGreen;      break;
  case 3   : Form1->Canvas->Brush->Color = clWhite;       break;
  case 4   : Form1->Canvas->Brush->Color = clYellow;      break;
  case 5   : Form1->Canvas->Brush->Color = clRed;         break;
  case 6   : Form1->Canvas->Brush->Color = clBlue;        break;
  case 7   : Form1->Canvas->Brush->Color = (TColor)RGB(133,222,145);   break;
      default:
                ;
}
                Form1->Canvas->Rectangle(gh[j], k+30, gh[j]+40, k+70);

                }
            k=k+40;
        }
}


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
(This post was last modified: 18.01.2012 22:12 by packa.)
18.01.2012 22:11
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6138
Post: #43

только сейчас добрался до домашнего компа...

Пакка, мой тебе совет - для начала научись пользоваться динамическим созданием компонентов, это куда лучше статического. Плюс, всегда отделяй GUI-логику приложения от "независимых" расчётов: для них, привязка к каким-то конкретным GUI-компонентам - это зло (если нужно использовать какое-то значение свойства компонента, просто передавай его в функцию по значению).

А уже после этого, можно реализовывать всякие "интерфейсные" фичи вроде перетаскивания картинок, если сама структура программы грамотная. Например, для твоей программы может подойти такая реализация:
   
   
P.S. Разумеется, нужно предварительно иметь "пустую" форму с одной-единственной кнопкой Button1 (ну и bmp-картинки для рисования квадратиков).
P.P.S. Вверху никакой не PHP Ab Надеюсь, что с кодом разберёшься...


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
21.01.2012 23:26
Find all posts by this user Quote this message in a reply
packa Offline

Posts: 1218
Post: #44

К сожалению это очень далеко от базиса, так что доберусь не скоро (((

Я пока нашел другой путь (уж извини, тут долго ответа не было) )

Но никак не пойму что не так...
Image: d211e7aab0e9t.jpg

Вот двойной цикл заполнения картинками
1) case 0 должен работать, не понимаю что не так
2) Последняя строчка должна заполняться по циклу, а не пустыми изображениями (это видно из-за первого массива, но если его поменять, опять же ошибка вылазит )

Первый массив определяет цифру каждой ячейку, впоследствии кейзами ставится соответствующая картинка
Code:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
randomize();
for(int i = 0 ;i < 8; i++)
        {
        for(int j = 1 ;j < 9; j++)
                {
                bh[i][j]=random(8);
                }
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int ProhodMassiva=0;
int OtstupVniz = 0;
NumImg=8;
Img=new TImage*[NumImg];
for(int j=0;j<NumImg;j++)
{
        for(int i=0;i<NumImg;i++)
        {
        Label7->Caption=Label7->Caption+bh[i][j] ;
        Label8->Caption=Label8->Caption+ProhodMassiva ;
        ProhodMassiva=ProhodMassiva++;
        switch (bh[i][j])
                {
                //case 1   : Form1->Canvas->Brush->Color = RGB(0, 0, 0);
                //case 0   : Img[i]->Picture->LoadFromFile("18.bmp"); break;
                case 1   : Img[i]->Picture->LoadFromFile("11.bmp"); break;
                case 2   : Img[i]->Picture->LoadFromFile("12.bmp"); break;
                case 3   : Img[i]->Picture->LoadFromFile("13.bmp"); break;
                case 4   : Img[i]->Picture->LoadFromFile("14.bmp"); break;
                case 5   : Img[i]->Picture->LoadFromFile("15.bmp"); break;
                case 6   : Img[i]->Picture->LoadFromFile("16.bmp"); break;
                case 7   : Img[i]->Picture->LoadFromFile("17.bmp"); break;
                //case 8   : Img[i]->Picture->LoadFromFile("18.bmp"); break;
                default: ;
                }
        Img[i]=new TImage(this);
        Img[i]->Picture->LoadFromFile("18.bmp");
        Img[i]->Parent=this;
        Img[i]->Left=25+i*45;
        Img[i]->Top=10+OtstupVniz;
        Img[i]->Visible=true;

        }
OtstupVniz=OtstupVniz+49;
Label7->Caption=Label7->Caption+" " ;
Label8->Caption=Label8->Caption+" " ;
}delete Img;
}

Весь день, менял,менял,менял...
из чего сделал вывод, что я просто что то не знаю, потому что проверил вроде бы все возможные варианты
1)задаю в двумерном массиве bh[0 - 8] [0 - 8]
Теперь программа вылетает на первом символе отличным от нуля
Image: 4e0ad324f196t.jpg
2) меняю i=0 на i=1, в массиве изображений, результат не изменился
3) расширил NumImg=8 до NumImg=9; результат не изменился
4) Поместил в комментарий свич (!) Все циклы сработали исправно. Все 64 клетки заполнились рандомными цифрами
5) вернул массиву i с 1 до 9 j с 1 до 9 (так хоть работает), массиву изображений поставил j=1, i=1
опять ошибка на первом отличном от нуля символе

Я что только не делал, но так и ничего не нашел. Задал этот вопрос на парочке форумов программистов, естественно проигнорировали, помогает только личное обращение.

Только если будет неохото, или времени мало, то напиши чтобы я не ждал Sm

Спасибо за внимание

http://zalil.ru/32549967


подпись была удалена администрацией
просьба не использовать картинки с сайта heroeslibrary.net, так как на них ругается Chrome
(This post was last modified: 21.01.2012 23:49 by packa.)
21.01.2012 23:48
Find all posts by this user Quote this message in a reply
Efrit Offline
Administrators

Posts: 6138
Post: #45

Пакка, сразу несколько рекомендаций:

1) Если ты вводишь какую-то целочисленную переменную, которая не может быть отрицательной - всегда пиши в названии слово unsigned. Например, "индекс массива" всегда неотрицателен, поэтому его следует объявлять как unsigned int. И поверь, это ничуть не излишество.
Зачем это нужно? А вот зачем: (Click to View)
   
2) Если ты уверен, что твоя переменная не может принимать каких-то "больших" значений - то не стоит объявлять её тип как int, лучше пользуйся short int (диапазон из 216 значений) или даже char (диапазон из 28 значений). Это позволяет экономить оперативную память, поскольку значения таких типов занимают в ней меньше места - особенно, если они составляют собой массив.

3) Никогда не используй нумерацию каких-либо элементов (массива, списка, STL-контейнера) с единицы, как в строке 6 твоего кода. Только с нуля! Это часто может привести к ошибке исполнения - особенно, если приходится работать непосредственно с памятью (через указатели). Вот, кстати, за что мне ещё не нравится Borland VCL - в ней нумерация букв в String-овой строке идёт именно с единицы, прям как в Паскале каком-то. Хорошо хоть, std::string мне никто пользоваться не запрещает Sm

4) Если какая-то последовательность действий представляет собой логический блок, то есть ты можешь выделить его в какую-то функцию - то выделяй. Например, "заполнение массива bh случайными числами" - это и есть логический блок, и поэтому его лучше вынести в отдельную функцию. Плюс такого решения в том, что если тебе понадобилось обратиться к такому "блоку" снова - ты просто вызываешь функцию снова, а не тупо копипастишь код.

Более того, подобные функции нужно стараться делать как можно более "универсальными". Например, для вышеуказанного примера - чтобы функция "заполнения массива случайными числами" могла работать не только с массивом bh, а с любым массивом вообще. Это избавит тебя от необходимости написания новых функций для каждого массива - поскольку "универсальная" функция для подобных целей у тебя уже есть. Правда, при работе с массивами возникают сложности, связанные с тем, что для корректной работы с ними сторонних функций, необходимо каждый раз указывать размер массива. В связи с этим, возникает пятый пункт.

5) Вообще не используй статические массивы ("обычные"), а юзай динамические. Лучше всего - std::vector, он наиболее прост для понимания, плюс совместим с С-шными функциями, работающими со статическими массивами. У динамических массивов его размер всегда хранится "внутри" массива, плюс его (размер) в любой момент можно изменить (со статическим такой фокус не пройдёт).
   
   

   
   
Теперь ещё раз посмотри в мой код. Он всё ещё кажется тебе таким сложным? Давай я его объясню.

Первые три строки - это объявление динамического массива, о которых я говорил выше. Первая строка подключает библиотечный файл для работы с ними (её нужно писать лишь один раз внутри всего проекта). Типом "динамический массив" здесь является std::vector, а в фигурных скобках указан тип его элементов (например, "динамический массив элементов типа int" описывается как std::vector<int>). Но так как массив у нас двумерный, то в фигурных скобках записан "он сам". Надеюсь, теперь понятно, откуда взялась запись std::vector< std::vector<unsigned short> > ? Но так как всё время писать такую длинную конструкцию не очень красиво, то с помощью служебной команды typedef мы вводим для этой конструкции слово-синоним TMatrix (учти, что эта команда работает лишь с типами, это тебе не #define). Наконец, в третьей строке мы вводим сам динамический массив bh на основе только что созданного типа TMatrix.

Потом я объявляю две строковые константы. EXE_PATH - это просто путь к папке, где хранится экзешник твоей программы. Далее, функция GenerateMatrix заполняет твой массив bh случайными числами. Обрати внимание, что параметр "input" передаётся в неё по ссылке - таким образом, эту функцию можно использовать для любого массива, имеющего тип TMatrix - а не только для bh. Если что, в ней resize(...) - изменяет размер динамического массива. Всё остальное, думаю, понятно.

Функция DrawingMatrix рисует матрицу из Label-ов, как на скриншоте в твоём сообщении №40. Она работает по такому принципу: вначале она ищет Label-ы с именами вида "Label_i_j" (где i и j меняются) на форме form, и если не находит какие-то из них - то она их создаёт. После этого, она меняет их заголовок на нужное "число", взятое из массива input (в данном случае, массива bh). Текущий Label всегда хранится в указателе current, указывающем на только что найденный Label. Его поиск производится в этой строчке:

TLabel* current = dynamic_cast<TLabel*>(form->FindComponent(name));

Что она означает? Смотри справа налево. FindComponent - это метод формы form, который ищет компонент на этой форме по его имени (переменная name). Этот метод возвращает значение типа *TComponent, то есть указатель на тип TComponent. Для того, чтобы работать с ним, как с Label-ом, этот указатель нужно привести к типу *TLabel - то есть нужно сделать так, чтобы он указывал именно на Label. Для этого вызывается шаблонная функция dynamic_cast<TLabel*>(...) (то бишь, сама функция называется "dynamic_cast", а в фигурных скобках записан новый тип параметра, к которому и будет приводить указатель, записанный в круглых скобках). После всего этого, справа от знака равенства у нас будет указатель на TLabel, который и можно присвоить переменной current. Остальное просто.

Наконец, функция DrawingSquares создаёт/изменяет картинки (TImage), подгружая в них информацию из соответствующих файлов. Загрузка содержимого картинки из файла "обёрнута" в конструкцию try-catch - это блок "обработки исключений" в C++ (поскольку файл может отсутствовать, и тогда функция LoadFromFile сгенерирует исключение, которое и будет поймано catch). Всё остальное в ней аналогично предыдущей функции. Все эти три функции вызываются в самом низу, в обработчике нажатия кнопки Button1.

P.S. Надеюсь, что не зря распинался4


Welcome to the soldier side,
Where there is no one here but me.
People all grow up to die,
There is no one here but me...
22.01.2012 17:16
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2017 MyBB Group