singlepost

Никак не могу разобраться в написании классов… << На главную или назад  

Теорию по ООП защитил на отлично, а вот с практикой большие проблеммы(

1.нужно разработать класс способный изменять размеры изображения в TImage…
2.(+ нужно учитывать что при не пропорциональном изменении размера надо будит обрезать края дабы не допустить искажения)

приступил к первому пункту…

сам класс:
unit KLimg;

interface
uses
Classes, ExtCtrls;
type
Kimg=class(Timage)
private
img:Timage;
h,w:Integer;
public
constructor Criate();
procedure nowy(img1:Timage; h1,w1:Integer) ;
function NewImg:TImage;
end;
implementation
constructor Kimg.Criate();
begin
end;
procedure Kimg.nowy(img1:Timage; h1,w1:Integer) ;
begin
h:=h1;
w:=w1;
img1.Canvas.StretchDraw(Rect(0, 0, h, w), img1.Picture.bitmap);
img1.Picture.Bitmap.Height:=w;
img1.Picture.Bitmap.Width:=h;
img1.Height:=w;
img1.Width:=h;
end;
function Kimg.NewImg:TImage;
var
img1:TImage;
begin
result:=img1;
end;
end .

кусок кода использующий класс:
procedure TForm1.Button3Click(Sender: TObject);
var
Img:Kimg;
h,w:Integer;
begin
img:=Kimg.criate ;
h:=strtoint(edit1.text);
w:=strtoint(edit2.text);
img.nowy(image1,h,w);
image1:=img.newimg;
end;

дальше нужна помощь, так как никогда ни занимался практичеким ООП наделал кучу ошибок Которых не могу найти(((
частично написаный код работает , при запуске, при первой попытке изменить размеры работает нормально, но если попытаться ещё раз изменить размер выдает ошибку(((
(наверное должен быть деструктор но куда его засунуть не знаю(

12 ответов в теме “Никак не могу разобраться в написании классов…”

  1. 12
    Андрей Соломонов ответил:

    книжку не читал… но посмотрел на многих сайта везде отзывы положительные!! причем очень положительные))))

  2. 11
    Константин Дёмин ответил:

    —== "Совершенный Код", С. Макконнелл ==—
    Настоятельно рекомендую купить.

  3. 10
    Kitt Wasserfall ответил:

    Таки скажу – их лучше всё-таки называть на нормальном англицком.

  4. 9
    Андрей Митов ответил:

    вот именно что никто не учил…

  5. 8
    Kitt Wasserfall ответил:

    >constructor Criate();
    >procedure nowy

    Эт кто ж тебя так переменные называть научил?

  6. 7
    Роман Белоус ответил:

    Гугл говорит, что это помогает =) :
    img.Picture.Graphic.Width := img.Width;
    img.Picture.Graphic.Height := img.Height;

    А вообще, разберись как устроен объект TImage, где какие размеры надо задавать, почитай доки.

  7. 6
    Андрей Митов ответил:

    немного поправил, работает, но при увеличении картинки получается такая вещь
    например картинка размером 50х50,
    изменяю её размер напримерна 100х100,
    и получаеться такая вещь, Timage принимает размеры 100х100, но её содержимое такое: в верхнем левом углу кусок 50х50 от растянутой картики, а остольная часть залита белым цветом(((
    как с этим ботроться?

    вод код:
    //paste.org/8179

  8. 5
    Роман Белоус ответил:

    Не знаю, наверное что-то типа:
    function Kimg.NewImg:TImage;
    begin
    __result:= TImage.Create;
    end;

    Посмотри как ты image1 создаёшь (в приведённом коде ты это опустил, судя по всему). Надо документацию к TImage смотреть, чтобы знать, как его создать, какие параметры нужны и т.п.

    На самом деле, мне кажется что тебе переписывать image1 новым объектом вообще нет смысла.

  9. 4
    Андрей Митов ответил:

    а как её инициализировать?

  10. 3
    Роман Белоус ответил:

    "Я сдал теорию секса на отлично, но вот с практикой проблемы. Попробовав позу 69, я наделал кучу ошибок и не могу их найти" =)
    Проблема тут не в отсутствии навыков "практического ООП", а в неумении программировать, что, впрочем, поправимо ;)

    Первый шаг на пути к успеху – записать свою программу так, чтобы её можно было прочитать без излишних усилий, т.е. в отформатированном виде. Это можно сделать используя, например знаки _ для отступов или опубликовав ссылку на код, лежащий на внешнем ресурсе вроде paste.org

    А вообще, проблема, думаю в том, что следующий кусок возвращает некое неинициализированное значение вместо собственно новой картинки. Как бы переменную не только объявить надо, но и объект создать тоже бы не помешало:
    function Kimg.NewImg:TImage;
    var img1:TImage;
    begin
    __result:=img1;
    end;
    А потом ты этим неинициализированным значением затираешь поле image1 в методе Button3Click. Ну а при следующем вызове метода nowy, который пытается использовать поле image1 (указывающее теперь неизвестно на что), ты получаешь некую ошибку памяти.

    ЗЫЖ Могу ошибаться, т.к. от Делфы далёк и проверить не на чем.
    ЗЗЫЖ С точки зрения "теории ООП" код тоже не ахти)

  11. 2
    Андрей Митов ответил:

    а мне почему то не смешно..((
    хотя бы в чём мои ошибкиукажите…

  12. 1
    Леонид Максимов ответил:

    жжете :)

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.