Poprawne zastosowanie funkcji FindComponent

2018-12-17 01:04
0

Witam,

chciałbym wczytać plik obrazka do jednego z obiektów Image (jest ich kilkadziesiąt) używając funkcji FindComponent.

Czy możecie sprawdzić czy jest to dobrze napisane? Po kompilacji błędy nie występują jednak program nie działa tak jak bym tego chciał (plik się nie wczytuje i to nie jest wina funkcji wczytującej, a raczej niewłaściwego znalezienia/adresowania obiektu). Właścicielem wszystkich obiektów jest SUDOkumacz.

void znajdzNumerPola (AnsiString numerPola_str)
{
    // numerPola_str jest zmienna, ktora mowi, jaki jest Name obiektu
    TComponent *component=SUDOkumacz->FindComponent(numerPola_str);
    if(component)
    {
        TImage *image = dynamic_cast<TImage *>(component);
        if(image)
        {
            image->Picture->LoadFromFile("img\\"+szukana_str+".jpg");
        }
    }
}
edytowany 1x, ostatnio: furious programming, 2018-12-17 01:07
SUDOkumacz nie dość, że po polsku to jeszcze slangiem. - MarekR22 2018-12-17 11:17
Obstawiam, że to ma być nazwa programu, ale ta nazwa nie powinna być używana dla głównego okna. - furious programming 2018-12-17 14:55
a to nie wiedziałem... podwójnie - i to, że nazwa programu nie powinna być w oknie (zawsze wydawało mi się, że w głównym oknie jest zwykle nazwa programu..), ani to, że po polsku raczej nie powinno się nazywać(nie myślę o swoim programie tak globalnie). to może jakaś gra słówek? - SUDO-Qmatch ?;) dzięki za nawet takie uwagi! - k1313 2018-12-17 20:34
Nazwa programu powinna się znajdować w głównym oknie, ale na belce tytułowej. Natomiast klasa głównego okna powinna się nazywać np. TMainForm – ta ma służyć programiście, więc powinna być sensowna, a użytkownik i tak nie ma zielonego pojęcia o tym co masz w kodzie źródłowym (chyba że to open source). - furious programming 2018-12-17 20:41
Ok, rozumiem. Dz - k1313 2018-12-17 21:01

Pozostało 580 znaków

2018-12-17 01:08
1

Jeśli wyskakują błędy, to jaka jest ich treść? Używałeś debuggera i wiesz w której linijce owy błąd się pojawia?

Poza tym czym jest SUDOkumacz? Formularz czy komponent? Znowu trzeba prosić o konkrety.


edytowany 5x, ostatnio: furious programming, 2018-12-17 01:12

Pozostało 580 znaków

2018-12-17 01:12
0

Nie. Kompiluje się bez zastrzeżeń, a podczas debuggowania wartości numerPola_str i szukana_str są odpowiednie (sprawdziłem poprzez if'a: (tego if'a wstawiłęm zamiast funkcji z FindComponent)

if (numerPola_str=="P21")
{
    SUDOkumacz->P21->Picture->LoadFromFile("img\\"+szukana_str+".jpg");
}

Plik przy if'ie wczytuje się w odpowiednim komponencie.
Edyta dodaje, że SUDOkumacz jest Formularzem.

edytowany 6x, ostatnio: furious programming, 2018-12-17 02:23
W miedzyczasie zdążyłem edytować swój post. - furious programming 2018-12-17 01:13

Pozostało 580 znaków

2018-12-17 01:14
0

Sprawdź czy możesz odczytać nazwę komponentu z referencji ze zmiennej component, a jeśli tak, to czy zgadza się z oczekiwaną. Jeśli wszystko gra to problem jest dalej, czyli podczas rzutowania lub błąd wywołuje LoadFromFile.


edytowany 3x, ostatnio: furious programming, 2018-12-17 01:16
ok.. sprawdzam - k1313 2018-12-17 01:17

Pozostało 580 znaków

2018-12-17 01:16
0

SUDOkumacz to Forma na która wstawiłem 81 obiektów Image.

Posty piszemy i edytujemy jednocześnie – mały bałagan się zrobił. - furious programming 2018-12-17 01:17

Pozostało 580 znaków

2018-12-17 01:19
1

Najlepiej by było gdybyś postawił break point na pierwszej instrukcji, czyli na tej:

TComponent *component=SUDOkumacz->FindComponent(numerPola_str);

i linijka po linijce sprawdzał która dokładnie wywołuje błąd. Następnie treść tego błędu wrzuć do posta (w odpowiednie znaczniki) lub zrób zrzut ekranu, jeśli nie będziesz w stanie skopiować treści błędu jako tekstu.


Pozostało 580 znaków

2018-12-17 01:27
0

wrzucam screena z wartością component (jaki powinien być tutaj znacznik?):
screenshot-20181217012845.png

edytowany 1x, ostatnio: k1313, 2018-12-17 01:28

Pozostało 580 znaków

2018-12-17 01:41
0

Adres referencji wygląda dobrze – jaka jest więc treść błędu?


Pozostało 580 znaków

2018-12-17 02:37
0

W zasadzie program dojeżdża do końca... i nie ładuje pliku. Czy debuggując powinienem na zmiennej componentodczytać taka samą wartość jak na zmiennej numerPola_str? (bo powinny się one pokrywać). Jeśli tak, to u mnie jest inaczej (widać wartość componentna screenie - a powinna, w tym akurat przypadku dla potrzeb sprawdzenia kodu, wynosić 'P21'). Co jeszcze mógłbym sprawdzić?

edytowany 2x, ostatnio: k1313, 2018-12-17 02:38

Pozostało 580 znaków

2018-12-17 03:49
k1313 napisał(a):

Czy debuggując powinienem na zmiennej componentodczytać taka samą wartość jak na zmiennej numerPola_str?

Nie, component przechowuje adres obiektu (komponentu), a numerPola_str ciąg znaków. Wartość P21 powinna być zwracana poprzez właściwość component->name, jeśli FindComponent faktycznie pobrał referencję tej kontrolki.

Co jeszcze mógłbym sprawdzić?

Czy plik pod zadaną ścieżką faktycznie istnieje.

Poza tym najpierw napisałeś że błąd istnieje i wyskakuje podczas działania programu, a teraz piszesz, że w zasadzie nie ma błędu, ale obrazek nie jest ładowany. No to jak jest w końcu?


edytowany 3x, ostatnio: furious programming, 2018-12-17 03:52

Pozostało 580 znaków

2018-12-17 11:25
0

A ja się zastanawiam, czemu szukana_str nie jest w żaden sposób powiązana z numerPola_str.
Może szukana_str ma cały czas tą samą wartość, więc nic się nie zmienia.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0