Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Загрузка файлов в проект


Автор: Maycal 12.10.2007, 12:23
Доброе время суток уважаемые программисты. Я начинающий программист, который неделю назад закончил первый самоучитель по C++. В самоучителе к сожалению не описан метод для загрузки файла в программу, заранее не определяя его. Я хочю использовать функции FindFirst и FindNext.
Как сделать так, чтобы при нажатие на конпку Next, загружалась 
в компонент Image1 фотография .bmp из папки заданный константой Patch? Например const String Patch = "D:\\Gallerea_Maycal\\"; При следующим нажатие на этуже кнопку, в томже Image1 появлялась следующая картинка из Patch и так далее.
Люди, для меня это очень важно! Заранее спасибо.

Автор: _hunter 12.10.2007, 12:38
http://forum.vingrad.ru/forum/topic-148212.html

Автор: FiMa1 12.10.2007, 12:49
Цитата
Неделю назад закончил первый самоучитель по C++. В самоучителе к сожалению не описан метод для загрузки файла в программу, заранее не определяя его. Я хочю использовать функции FindFirst и FindNext.

Этого и не должно быть описано в САМОУЧИТЕЛЕ ПО ЯЗЫКУ. Это определенная прикладная задача.
Цитата
Как сделать так, чтобы при нажатие на кнопку Next, загружалась 
в компонент Image1 фотография .bmp из папки заданной константой Patch? Например const String Patch = "D:\\Gallerea_Maycal\\"; При следующем нажатии на эту же кнопку, в том же Image1 появлялась следующая картинка из Path и так далее.

Предлагаю следующее: Пусть path = "d:\\prog\\", картинки называем к примеру так 1.bmp, 2.bmp, ... n.bmp
Тогда по программе для загрузки следующей картинки пишем что-то вида
Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString path = "d:\\prog\\"; // лежат файлы 1.bmp, 2.bmp
    static int imgnum = 0;
    const int MAX_IMG_NUM = 10; // количество картинок в директории
                          // лучше определять программно, поиском *.bmp файлов в path - FindFirst/FindNext

    if(++imgnum < MAX_IMG_NUM)
        Image1->Picture->LoadFromFile(path + imgnum + ".bmp");
}

Автор: Dronchik 12.10.2007, 13:05
Maycal, напиши точнее что ты используешь С++ или C++ Builder? Это разные вещи. Примеры данные _hunter и FiMa1 используют C++ Builder.

Автор: dumb 12.10.2007, 13:12
Dronchik, 
Цитата(Maycal @  12.10.2007,  13:23 Найти цитируемый пост)
в томже Image1 появлялась следующая картинка
smile

Автор: Dronchik 12.10.2007, 13:26
Maycal, создай string или чтото подобное, присваивай последовательно ему нужные тебе значения значения и используй этот string как имя битмапа. 

Автор: Maycal 12.10.2007, 13:52
Я пишу на языке C++ в среде разработки C++ Builder. Мне не нужно чтоб появлялся OpenDialog1 как предложил _hunter? и невкоем случае не задовать жестко файлы. Мне нужно сделать так, чтобы сколько в папке картинок (обсолютно с разными названиями), те и по очереде загружались в Image1 c использованием Button1 (Next). Я слышал что это можно сделать путем Findfirst и FindNext, но как конкретно сделать я не знаю. Помогите пожалуйсто!

Автор: Dronchik 12.10.2007, 14:00
http://www.codenet.ru/progr/cpp/sprd/findfirst_findnext.php

Автор: zkv 12.10.2007, 14:02
Цитата(Dronchik @  12.10.2007,  13:05 Найти цитируемый пост)
С++ или C++ Builder? Это разные вещи.

все равно что сказать: "птица и ворона разные вещи..."  smile 

Автор: Dronchik 12.10.2007, 14:12
Цитата(zkv @ 12.10.2007,  14:02)
Цитата(Dronchik @  12.10.2007,  13:05 Найти цитируемый пост)
С++ или C++ Builder? Это разные вещи.

все равно что сказать: "птица и ворона разные вещи..."  smile

я имел ввиду что кодинг на С++ простом отличается от кодинга на Билдере

Автор: FiMa1 12.10.2007, 14:15
Цитата(Maycal @ 12.10.2007,  13:52)
Я пишу на языке C++ в среде разработки C++ Builder. Мне не нужно чтоб появлялся OpenDialog1 как предложил _hunter? и невкоем случае не задовать жестко файлы. Мне нужно сделать так, чтобы сколько в папке картинок (обсолютно с разными названиями), те и по очереде загружались в Image1 c использованием Button1 (Next). Я слышал что это можно сделать путем Findfirst и FindNext.

В моем примере жесткой привязки нет...
http://msdn2.microsoft.com/en-us/library/aa365200.aspx

Автор: Lazin 12.10.2007, 14:20
В BCB есть свои функции FindFirst, FindNext (SysUtils). Работают они так: сначала вызываешь FindFirst с параметрами TSearchRec  и маской для поиска. Затем ф-ей FindNext ишешь следуюший файл, и так пока ф-лы отвечающие критерию не кончатся

Код

//глобальная переменная или член класса формы
TSearchRec searchResult;

-----

//событие OnCreate 
if ( FindFirst("*.bmp", faAnyFile, searchResult) == 0)
 Image1->Picture->LoadFromFile( searchResult.Next );

-----

//поиск и загрузка изображения
if (FindNext(searchResult) != 0)
 Image1->Picture->LoadFromFile( searchResult.Next );

-----

//событие OnClose формы
FindClose(searchResult);

Автор: zkv 12.10.2007, 14:32
Цитата(Dronchik @  12.10.2007,  14:12 Найти цитируемый пост)
кодинг на С++ простом

да не бывает кодинга на с++ простом, все равно работаешь в каком то определенном компиляторе, со своими особенностями, а просто с++ - это абстракция, на ней программу не напишешь...

Автор: Dronchik 12.10.2007, 14:39
zkv, понял, туплю

Автор: dumb 12.10.2007, 14:44
упрощаем: smile
Код

const String Patch = "D:\\Gallerea_Maycal\\";

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  AnsiString sMask = Patch + "*.bmp";
  SendMessage(ListBox1->Handle, LB_DIR, DDL_READONLY | DDL_READWRITE, reinterpret_cast<LONG>(sMask.c_str()));
  ListBox1->ItemIndex = 0;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if (ListBox1->ItemIndex < ListBox1->Items->Count - 1)
    ListBox1->ItemIndex++;
  else
    ListBox1->ItemIndex = 0;
  String curFile = Patch + ListBox1->Items->Strings[ListBox1->ItemIndex];
  try {
    Image1->Picture->LoadFromFile(curFile);
  }
  catch (Exception &E)
  {
    Image1->Picture = 0;
  }
}
//---------------------------------------------------------------------------

а ListBox можно сделать скрытым...

Автор: Maycal 12.10.2007, 16:33
Lazin, я ввожу код именно как ты и написал, но получаю сообщение: 
Код

[C++ Error] Unit1.cpp(32): E2316 'Next' is not a member of 'TSearchRec'

как быть?

Автор: Maycal 12.10.2007, 18:10
Спасибо вам большое за помощь. Я разобрался с этой функцией, вот версия полностью рбочий программы. Еще раз напомню для других читателей суть программы: при нажатие на кнопку Next в Image1 происходит загрузка файла из папки заданной константой Patch. При следующем нажатие на кнопку, загружаеться следующий рисунок. При этом файлы заданы не жестко! Благодаря функциям FindFirsFile и FindNextFile данная задача решаеться просто:

Код

// Здесь подключаем модуль dir, обявляем структуру ffblk, объявляем переменную done как целое число и задаем папку откуда будет производиться загрузка файлов как константу Patch.
#include "dir.h"
struct ffblk ffblk;
int done;
const String Patch = "D:\\Gallerea_Maycal\\";
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// В методе FormCreate просходит загрузка и отображение первого файла из папки заданной константой Patch, тоесть папки D:\Gallerea_Maycal\

SetCurrentDirectory( Patch.c_str());
 done = findfirst("*.bmp",&ffblk,0);
 Image1->Picture->LoadFromFile( ffblk.ff_name);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
// А в методе Button1Click происходит загрузка следующего файла из папки заданной константой Patch
if (!done)
done = findnext(&ffblk);
Image1->Picture->LoadFromFile(ffblk.ff_name);
}
//--------------------------------------------------------------------------- 

Но у меня возникло еще несколько вопросов: как вычеслить число файлов которые лежат в папке заданной константой Patch?

Автор: dumb 13.10.2007, 00:38
Цитата(Maycal @  12.10.2007,  19:10 Найти цитируемый пост)
данная задача решаеться просто
как бы это помягче?.. вобщем, возьми лучше целиком тот код, что я привел в предыдущем посте. а в ListBox1->Items->Count возьмешь количество файлов.

Автор: Maycal 13.10.2007, 09:41
Хорошо, спасибо. А как вычеслить число файлов которые лежат в папке заданной константой Patch? 

Автор: dumb 13.10.2007, 13:33
smile
аллоэ! читать будем или где?! smile перечитай еще раз мой предыдущий пост.

Автор: Maycal 13.10.2007, 14:55
Ок, спасибо большое

Автор: Maycal 17.10.2007, 14:31
Как сделать так попроще, чтобы картинка внедрялась прямо в .exe файл?

Автор: dumb 17.10.2007, 14:41
в поиск по слову "ресурсы".

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)