Screen.Width - Record, object or class type required

0

Było w google - http://haker.com.pl/threads/14420-b%C5%82%C4%85d-przy-screenie - ale niestety bez rozwiązania...
Ten sam problem, w innej aplikacji działa bez problemu, funkcja i deklaracje identycznie

function ZrobScr(gdziezapisac : ShortString; jakoscscreena : Integer; Szybkosc : Boolean = TRUE; Blokuj : Boolean = FALSE) : Boolean;
var
  JPG : TJPEGImage; 
  X, Y, XS, YS : Integer;
  Locked : Boolean;
  Canvas : TCanvas;
  Bmp1 : TBitmap;
  R : TRect;
const
  cTileSize = 50;
begin
  try
  try
    ZrobScr := TRUE;    
    Canvas := TCanvas.Create;
    Canvas.Handle := GetWindowDC(GetDesktopWindow);


    BMP1 := TBitmap.Create;  
    BMP1.Width := Screen.Width; // wywala błąd "Record, object or class type required"
    BMP1.Height := Screen.Height; // to samo. W innej aplikacji identyczna funkcja - bez błędu...


    If Blokuj then Locked := Canvas.TryLock else Locked := FALSE;
    try
      XS := Pred(Screen.Width div cTileSize);
      if Screen.Width mod cTileSize > 0 then
      Inc(XS);
      YS := Pred(Screen.Height div cTileSize);
      if Screen.Height mod cTileSize > 0 then
      Inc(YS);
        for X := 0 to XS do
          for Y := 0 to YS do
          begin
          R := Rect(
          X * cTileSize, Y * cTileSize, Succ(X) * cTileSize,
          Succ(Y) * cTileSize);
          BMP.Canvas.CopyRect(R, Canvas, R);
          end;
    finally
      if Locked then Canvas.Unlock;
      ReleaseDC(0, Canvas.Handle);
      Canvas.Free;
    end;
    JPG := TJPEGImage.Create;
    JPG.Assign(BMP1); 
    If szybkosc then JPG.Performance := jpBestSpeed else JPG.Performance := jpBestQuality;
    If jakoscscreena > 100 then jakoscscreena := 100;
    If jakoscscreena < 1 then jakoscscreena := 1;
    JPG.CompressionQuality := jakoscscreena;
    JPG.Compress; 
    JPG.SaveToFile(gdziezapisac);
  except
    ZrobScr := FALSE;
  end;
  finally
    JPG.Free;
    BMP1.Free;
  end;
end;

Ewentualnie mogę przenieść całą aplikację do nowej, ale wolałbym wiedzieć, czemu to nie działa...

1

Graphics.TBitmap to jest to, o co ci chodzi; najwyraźniej Delphi/Lazarus bierze z innego modułu (bodajże Windows)

0
Patryk27 napisał(a):

Graphics.TBitmap to jest to, o co ci chodzi; najwyraźniej Delphi/Lazarus bierze z innego modułu (bodajże Windows)

Chodzi raczej o sposób pobrania rozdzielczości. Niemal wszystkie źródła( http://www.delphitricks.com/source-code/graphic/get_the_current_screen_resolution.html , Jak zrobić zrzut z ekranu ) podają, że robi się to tak:

    B.Width := Screen.Width;
    B.Height := Screen.Height;

Błąd powoduje samo Screen.Width, kompilator tego po prostu nie zna. Jak zrobić, żeby poznał?

0
var
  BMP1 : Graphics.TBitmap;
[...]
begin
    BMP1 := Graphics.TBitmap.Create;
    BMP1.Width := Screen.Width; // niestety, ciągle kompilator pokazuje tu   [Error] Unit1.pas(450): Record, object or class type required
    BMP1.Height := Screen.Height;
[...]
end;
1

Ewentualnie mogę przenieść całą aplikację do nowej, ale wolałbym wiedzieć, czemu to nie działa...

Po pierwsze uno, nie zadałeś pytania, a według mnie jest to podstawa dobrego pytania (sic), ale widać tutaj już nawet nikt na to nie liczy (grunt że umiesz podać błąd - nie, tego też nie zrobiłeś!). Ale chociaż kod jest, więc jest mniej więcej w średniej się mieścisz.

Ale doceniam twoje chęci, nawet zalogowałeś się. Mam nadzieję że następne twoje pytania będą zawierały pytanie.

A teraz co do pytania (którego de facto nie ma).
Kompilator (przynajmniej FPC) jeżeli są konflikty nazw, to domyślnie bierze definicje z ostatniego dodanego unita w którym to jest. Jeżeli chcesz to ominąć to możesz zmienić kolejność unitów albo użyć prefiksa precyzującego o który moduł ci chodzi.

Często niby 'niewidzenie' czegoś wynika po prostu z przesłonięcia tego przez coś innego (w Lazarusie możesz sprawdzić do czego się odwołujesz zaznaczając to co cie interesuje np. Screen i kliknąć Alt+Strzałka w górę. wylądujesz tam gdzie się odwołujesz).

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